Python-strace命令追踪ssh操作
Python-strace命令追踪ssh操作
通过strace 命令追踪ssh的进程ID,记录操作的命令[实际上是内核里面记录的东西],进行操作日志的Py解析达到效果
追踪进程并写入ssh操作到文件中
Ps: 此时机器A已经ssh登录了机器B,取得它的ssh进程PID
机器A登录后的操作命令就记录在了ssh.log文件中了
登陆从A登陆B机器
[root@136 ~]# ssh 192.168.0.137 root@192.168.0.137's password: Last login: Sun Apr 28 13:59:08 2019 from 192.168.0.136 [root@137 ~]#
取得PID
[root@136 ~]# ps -ef | grep ssh root 6861 1 0 4月19 ? 00:00:00 /usr/sbin/sshd -D root 45477 6861 0 13:57 ? 00:00:00 sshd: root@pts/2 root 45478 6861 0 13:57 ? 00:00:00 sshd: root@pts/0 root 45479 6861 0 13:57 ? 00:00:00 sshd: root@pts/1 root 45579 45483 0 14:04 pts/1 00:00:00 ssh 192.168.0.137 root 45591 45485 0 14:07 pts/2 00:00:00 grep --color=auto ssh [root@136 ~]#
strace追踪
[root@136 ~]# strace -f -p 45579 -t -o ssh.log strace: Process 45579 attached
[root@136 ~]#
远端执行命令并退出
1 ls 2 3 df -h 4 5 ifconfig 6 7 ls 8 9 touch aa 10 11 echo '123' >> aa 12 13 vim aa
本地分析
基本取得远端执行的命令 [root@136 ~]# python audit.py ['14:07:20', '\\r'] ['14:07:22', 'ls\\rdf -h\\r'] ['14:07:24', 'ifcon\\t\\r'] ['14:07:25', 'ls\\r'] ['14:07:30', 'vim\\10\\10\\10\\10touc h aa\\r'] ['14:07:37', "\\10echo '[1<-]123[->1] >> aa\\t\\r"] ['14:07:39', 'vim aa\\t\\r'] ['14:07:44', '\\33[2;2R\\33[>1;10;0c[down 1]o456\\33:wq\\r'] [root@136 ~]#
脚本
1 #_*_coding:utf-8_*_ 2 3 import re 4 5 class AuditLogHandler(object): 6 7 '''分析audit log日志''' 8 9 def __init__(self, log_file): 10 11 self.log_file_obj = self._get_file(log_file) 12 13 def _get_file(self,log_file): 14 15 return open(log_file) 16 17 def parse(self): 18 19 cmd_list = [] 20 21 cmd_str = '' 22 23 catch_write5_flag = False #for tab complication 24 25 for line in self.log_file_obj: 26 27 #print(line.split()) 28 29 line = line.split() 30 31 try: 32 33 pid,time_clock,io_call,char = line[0:4] 34 35 if io_call.startswith('read(4'): 36 37 if char == '"\\177",':#回退 38 39 char = '[1<-del]' 40 41 if char == '"\\33OB",': #vim中下箭头 42 43 char = '[down 1]' 44 45 if char == '"\\33OA",': #vim中下箭头 46 47 char = '[up 1]' 48 49 if char == '"\\33OC",': #vim中右移 50 51 char = '[->1]' 52 53 if char == '"\\33OD",': #vim中左移 54 55 char = '[1<-]' 56 57 if char == '"\33[2;2R",': #进入vim模式 58 59 continue 60 61 if char == '"\\33[>1;95;0c",': # 进入vim模式 62 63 char = '[----enter vim mode-----]' 64 65 66 67 68 69 if char == '"\\33[A",': #命令行向上箭头 70 71 char = '[up 1]' 72 73 catch_write5_flag = True #取到向上按键拿到的历史命令 74 75 if char == '"\\33[B",': # 命令行向上箭头 76 77 char = '[down 1]' 78 79 catch_write5_flag = True # 取到向下按键拿到的历史命令 80 81 if char == '"\\33[C",': # 命令行向右移动1位 82 83 char = '[->1]' 84 85 if char == '"\\33[D",': # 命令行向左移动1位 86 87 char = '[1<-]' 88 89 90 91 cmd_str += char.strip('"",') 92 93 if char == '"\\t",': 94 95 catch_write5_flag = True 96 97 continue 98 99 if char == '"\\r",': 100 101 cmd_list.append([time_clock,cmd_str]) 102 103 cmd_str = '' # 重置 104 105 if char == '"':#space 106 107 cmd_str += ' ' 108 109 110 111 if catch_write5_flag: # to catch tab completion 112 113 if io_call.startswith('write(5'): 114 115 if io_call == '"\7",': # 空键,不是空格,是回退不了就是这个键 116 117 pass 118 119 else: 120 121 cmd_str += char.strip('"",') 122 123 catch_write5_flag = False 124 125 except ValueError as e: 126 127 print("\033[031;1mSession log record err,please contact your IT admin,\033[0m",e) 128 129 130 131 # print(cmd_list) 132 133 for cmd in cmd_list: 134 135 print(cmd) 136 137 # return cmd_list 138 139 140 141 if __name__ == "__main__": 142 143 parser = AuditLogHandler('ssh.log') 144 145 parser.parse()