参考(学习文章)文章

https://github.com/Bypass007/Emergency-Response-Notes

第一章 应急响应-webshell查杀

1.黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx}

用d盾扫可以扫出三个webshell

从上到下分别是一句话木马,哥斯拉马和混淆一句话
打开哥斯拉马可以找到flag

2.黑客使用的什么工具的shell github地址的md5 flag{md5}

哥斯拉马
https://github.com/Tas9er/ByPassBehinder

3.黑客隐藏shell的完整路径的md5 flag{md5} 注 : /xxx/xxx/xxx/xxx/xxx.xxx

我们可以用如下命令来读取web命令下的所有隐藏文件

1
find /var/www/html/ -type f -name ".*"


可以发现一个php文件

读取后发现其为木马
/var/www/html/include/Db/.Mysqli.php

4.黑客免杀马完整路径 md5 flag{md5}

题目问的是免杀马,正常的免杀马是无法通过工具扫描得到的,一般得通过日志来查看
这道题目是apache的环境日志文件为/var/log/access.log

其实这个所谓的免杀马就是经过混淆的木马,而那种程度的混淆d盾完全可以扫描出来

第一章 应急响应-Linux日志分析

日志文件 说明
/var/log/cron 记录了系统定时任务相关的日志
/var/log/cups 记录打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/mailog 记录邮件信息
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/btmp 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/log/utmp 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/secure 在 Red Hat/CentOS 等系统上,记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/auth.log 在 Debian/Ubuntu 等系统上,记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中

我们要写的这到题目主要是登陆日志的审查即
/var/log/auth.log
登陆失败日志/var/log/btmp 使用lastb查看
最后一次登陆日志 /var/log/lastlog 使用lastlog
登陆成功的用户日志/var/log/wtmp 使用last
目前登陆用户 /var/log/utmp //w、who、users

1.有多少IP在爆破主机ssh的root帐号,如果有多个使用”,”分割

我们这里直接使用正则来进行日志审查

题目问爆破的ip,那么我们只要找爆破失败的即可。再auth.log中爆破失败的关机词为Failed password for root我们可以使用如下命令来直接筛选出ip

1
cat /var/log/auth.log.1 |grep -a "Failed password for root"|awk '{print$11}'|sort -n|uniq -c|awk '{print $2}'

来解释一下上面的指令吧。 grep -a就将文件强制是为文本文件查找含目标字符的哪一行。

awk 一个分组指令其会对文本的每一行进行处理,默认以空格未分隔符来分组。如 awk '{print $1}'输出第一个组 即第一列,其也可以输出多组 awk '{print $1,$2,$3}'

sort排序命令 -n 以数字排序默认是按文本进行排序

uniq 去重并计数

flag{192.168.200.2,192.168.200.31,192.168.200.32}

2.ssh爆破成功登陆的IP是多少,如果有多个使用”,”分割

其问登陆成功的ip关键词为Accepted

1
cat /var/log/auth.log.1 |grep -a "Accepted "|awk '{print$11}'|sort -n|uniq -c|awk '{print $2}'

3.爆破用户名字典是什么?如果有多个使用”,”分割

该日志的格式为 for xxxx for xxx.xxx.xxx for与form之间为用户名而from后为ip
因为我们要找字典,其实就是找登陆失败的用户名

1
cat /var/log/auth.log.1 |  grep "Failed password" |perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

这里解释一下perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'的意思
perl是一个高级编程语言其特点是高效处理文本。其参数执行的代码的意思如下
1
2
3
4
5
while($_=<>){ ... }:
<> 是 Perl 的输入操作符,它会从标准输入中逐行读取数据,直到遇到文件结尾(EOF)。
$_ 是默认的输入变量,while($_=<>){ ... } 会循环处理每一行输入。

while循环里是一个正则匹配/for(.*?) from/其匹配for xxx from 然后再通过print "$1\n"来输出第一个捕获组也就是输出第一个括号的内容,也就是用户名

4.登陆成功的IP共爆破了多少次

前面我们就找到了爆破成功的ip为192.168.200.2那我们之间用如下代码来看其爆破次数

1
cat /var/log/auth.log.1 |  grep "root from 192.168.200.2" 

如果爆破次数过多可以使用如下方法来统计

1
cat /var/log/auth.log.1| grep -a "Failed password for root from 192.168.200.2"|awk '{print $11}'|uniq -c

5.黑客登陆主机后新建了一个后门用户,用户名是多少

新建用户的代码为new user我们这里之间找就好了

1
cat /var/log/auth.log.1 | grep -a "new user"

常用命令

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
1、定位有多少IP在爆破主机的root帐号:    
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

2、登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

3、增加一个用户kali日志:
Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
#grep "useradd" /var/log/secure

4、删除用户kali日志:
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
# grep "userdel" /var/log/secure

5、su切换用户:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)

sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now

我这里之间把应急响应手册上的扒下来了。上面的命令和我们的写的有点不太一样,但大同小异,我们主要的关注点应该再正则匹配的点上

应急响应-linux入侵排查

1.web目录存在木马,请找到木马的密码提交

d盾扫一下在1.php有webshell
flag{1}

2.服务器疑似存在不死马,请找到不死马的密码提交

看index.php会发现其有写马逻辑。应该是index.php写入的马
将其md5值解密得到密码为hello

flag{hello}

3.不死马是通过哪个文件生成的,请提交文件名

上一题已经找到了
flag{index.php}

4.黑客留下了木马文件,请找出黑客的服务器ip提交

我们看目录可以发现应该shell(1).elf的可执行文件。
猜测其为远控程序之类的,那么我们只要运行然后看网络流量不就可以了

1
2
3
4
5
6
7
8

netstat -antlp

-a: 显示所有的连接和监听的端口,包括已连接的和处于监听状态的端口。
-n: 显示数字形式的地址和端口号,而不是域名和服务名称。这样可以加速输出显示,因为系统不会执行域名解析。
-t: 仅显示 TCP 连接。默认情况下,netstat 会显示所有协议的连接(如 TCP、UDP),但加上 -t 后,结果只会显示 TCP 连接。
-l: 仅显示监听状态的端口。它不会显示已经建立的连接,只会显示当前正在监听的端口。
-p: 显示每个连接或监听端口的进程 ID(PID)和对应的程序名称。这样你可以看到哪些程序正在使用网络连接。

我们使用如上指令来监听
显示所有连接和监听端口
以数字格式显示地址和端口
仅显示 TCP 连接
仅显示处于监听状态的端口
显示进程 ID 和程序名称

再运行恶意的shell(1).elf文件

当然这个文件没有执行权限文件直接使用chmod来该权限接即可

注意我是再做题时进行这种操作,如果是再现实场景中我们需要再虚拟机中进行

当然我们也可以用沙箱。

但是沙箱并不能得出端口号。
flag{10.11.55.21}

5.黑客留下了木马文件,请找出黑客服务器开启的监端口提交

上面已经出了
flag{3333}