反向tcp shell编写

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反向tcp shell编写相关的知识,希望对你有一定的参考价值。

本次实验我们来尝试学习编写反向tcp连接的shellcode。
先用c语言实现,实现的步骤很简单
源码在re.c中
在这里插入图片描述

这里存在很多系统调用,我们依次看下来。分别是socket,connect,dup2,execve。
这里需要注意的地方就是socket的返回值会被connect和dup2调用。
程序建立socket以后会连接远程主机,远程主机的信息我们都放在了serv_addr结构体中。
连接成功之后会返回套接字文件描述符,可以使得用户与套接字接口进行通信。因为我们写的反向tcp的程序希望实现交互功能,所以我们需要使用套接字来复制stdin,stdout,stderr(文件描述符为0,1,2)并执行shell(即三次调用dup2)。
这样一来,因为被复制到套接字,所以发给socket的信息都会发到shell,而shell发给stdin,stdout,stder的内容也都会发给套接字。这样就实现了交互的功能。
红色箭头指向的地方是需要修改的,分别是ip和端口的16进制表示
编译
在这里插入图片描述

然后将生成的文件上传到107
在这里插入图片描述

本地nc监听
在这里插入图片描述

107上执行
在这里插入图片描述

接着在本地就可以执行命令了
在这里插入图片描述

说明成功实现了反弹

接下来依次分析,先看socket部分
在这里插入图片描述

原型如下
在这里插入图片描述

结合汇编,可以知道socket三个参数,分别被赋为2,2,0
接下来分析connect部分
在这里插入图片描述

connect这一部分的系统调用比较复杂
查看原型
在这里插入图片描述

connect()系统调用把由文件描述符sockfd所代表的套接字连接到addr所指定的地址上,参数 addrlen用于标明addr的大小。
对应着来分析汇编。
Sw v 0 , − 1 ( v0,-1( v0,1(sp):将socket返回的套接字文件描述符 v 0 保 存 到 v0保存到 v0sp-1中,然后通过lw a 0 , − 1 ( a0,-1( a0,1(sp)将文件描述符赋给connect第一个参数
接下来的三条指令用来构造sockaddr结构体的sin_family参数。
然后是设置端口
接着设置ip
一直到执行完sw t 6 , − 26 ( t6,-26( t6,26(sp),结构体已经构造完毕。
Addiu a 1 , a1, a1,sp,-30指出结构体首地址是从 s p − 30 开 始 接 下 来 两 条 指 令 将 结 构 体 大 小 即 16 写 到 c o n n e c t 的 第 三 个 参 数 sp-30开始 接下来两条指令将结构体大小即16写到connect的第三个参数 sp3016connecta2
可以看出,这里就关键的环节就是构造sockaddr结构体
来到dup2复制文件描述符的系统调用
在这里插入图片描述

可以看到使用了循环,dup2系统调用执行了3次,用于复制3个句柄,之后就可以开始用execve系统产生一个shell
之前的实验里我们学习了如果通过execve调用来执行任意命令。
再回顾一遍,其原型为
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
filename:程序所在的路径
argv:传递给程序的参数,数组指针argv必须以程序(filename)开头,NULL结尾
envp:传递给程序的新环境变量,无论是shell脚本,还是可执行文件都可以使用此环境变量,必须以NULL结尾
这里filename为//bin/sh,argv为//bin/sh,envp为null

在这里插入图片描述

使用下面的命令启动
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append “root=/dev/sda1 console=tty0” -net nic,macaddr=00:16:3e:00:00:01 -net tap
可以看到如下界面
在这里插入图片描述

输入root/root即可
在这里插入图片描述

查看ip
在这里插入图片描述

查看ubuntu的
在这里插入图片描述

由于直接操作不方便。我们在ubuntu上再开一个终端,ssh过来
在这里插入图片描述

将完整的shellcode组合后记得修改符合自己情况的ip和端口
在这里插入图片描述

注释中已经说明,以我这边为例,我希望反向连接到ubuntu上,即192.168.1.106,端口为30583的话,都需要转为16进制
30583十六进制为0x7777
192.168.1.106十六进制为
在这里插入图片描述

高位c0a8,低位016a
修改如图
在这里插入图片描述

完整的代码在re_tcp.s,编译
在这里插入图片描述

file查看可以看到是32位大端程序
接下来通过scp将其上传到107机器
在这里插入图片描述

切换到107看看
在这里插入图片描述

可以看到已经成功上传了
接着在106上nc监听本地端口
在这里插入图片描述

在107上执行re_tcp
在这里插入图片描述

此时回到106,可以输入一些命令进行测试
在这里插入图片描述

这就说明编写的脚本成功起作用了。

参考:
exploit-db上典型的反向tcpshell的例子:https://www.exploit-db.com/exploits/45541
2《揭秘家用路由器0day漏洞挖掘技术》

以上是关于反向tcp shell编写的主要内容,如果未能解决你的问题,请参考以下文章

shell基本语法2

Python攻防-Socket通信建立TCP反向连接

Python攻防-Socket通信建立TCP反向连接

[shellcode分享]Linux/x64 - 反向 (0.0.0.0:1907/TCP) Shell Shellcode (119 字节)

[shellcode分享]Linux/x64 - 反向 (0.0.0.0:1907/TCP) Shell Shellcode (119 字节)

JavaScript反向shell