反向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保存到
v0保存到sp-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的第三个参数
sp−30开始接下来两条指令将结构体大小即16写到connect的第三个参数a2
可以看出,这里就关键的环节就是构造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编写的主要内容,如果未能解决你的问题,请参考以下文章
[shellcode分享]Linux/x64 - 反向 (0.0.0.0:1907/TCP) Shell Shellcode (119 字节)
[shellcode分享]Linux/x64 - 反向 (0.0.0.0:1907/TCP) Shell Shellcode (119 字节)