后浪笔记一零二四

https://github.com/strace/strace

一个诊断、调试和指导用户空间实用程序,具有 Linux 的传统命令行界面。它用于监视和篡改进程与 Linux 内核之间的交互,包括系统调用、信号传递和进程状态更改。 strace 的操作由称为ptrace的内核功能实现。

使用strace命令跟踪用户执行的命令

#!/bin/bash

ssh_root_proc=`ps -ef|grep "[s]shd"|awk '{ if ($3=="1") print $2 }'`
echo "已发现 SSH 守护进程 PID: $ssh_root_proc"
echo "请核对下面的输出以确认该 PID 是否正确"
echo
ps -ef|grep "[s]shd"
echo
echo "如果正确请按 y/Y,否则输入正确的 PID 后按回车,注意是带 -D 选项的进程,按 Ctl-C 退出"
read ssh_pid
if [ "$ssh_pid" = "y" -o "$ssh_pid" = "Y" ]
then
	ssh_pid=$ssh_root_proc
elif [ -z "$ssh_pid" ]
then
	echo "未输入正确的 PID"
	exit 1
fi

user_grep=`awk -F":" '{ if ( $3 > 100 ) print $1 }' /etc/passwd | xargs -ivar echo -n "var|" | sed 's/$/password/'`

strace -f -e trace=execve -s 256 -p $ssh_pid 2>&1 | while read SSH
do
	cmd_test=`echo $SSH | grep execve`
	if [ $? -eq 0 ]; then
		# 获取 PID
		pid=$(echo $SSH | awk '{print $2}' | sed 's/\[\|\]//g')

		# 检查 /proc/<pid>/status 文件是否存在并可读
		if [ -r "proc/$pid/status" ]; then
			# 获取用户名
			username=$(awk '/^Uid:/ { uid=$2 } END { while ((getline < "/etc/passwd") > 0) { split($0, a, ":"); if (a[3] == uid) { print a[1]; exit }}}' /proc/$pid/status)
		else
			username="unknown"
		fi

		# 获取当前时间戳
		current_time=$(date "+%Y-%m-%d %H:%M:%S")

		# 输出包含时间,用户名和命令的信息
		echo "[$current_time] EXECUTED COMMAND by $username: $SSH"
	fi
done

注意,这个脚本必须提前运行,无法监控已经登录SSH会话的用户,另外也无法记录bash的内置命令,因为内置命令不会触发execve系统调用。


本文发表于 0001-01-01,最后修改于 0001-01-01。

本站永久域名「 jiavvc.top 」,也可搜索「 后浪笔记一零二四 」找到我。


上一篇 « 下一篇 »

赞赏支持

请我吃鸡腿 =^_^=

i ysf

云闪付

i wechat

微信

推荐阅读

Big Image