5

渗透基础——SSH日志的绕过

 3 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E5%9F%BA%E7%A1%80-SSH%E6%97%A5%E5%BF%97%E7%9A%84%E7%BB%95%E8%BF%87/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

0x00 前言


SSH是一种网络协议,用于计算机之间的加密登录,通常用于远程登录Linux系统。

在渗透测试中,通常需要考虑SSH的口令爆破和日志删除。

本文将要介绍一些渗透测试相关的基础内容,结合利用方法给出检测建议。

0x01 简介


本文将要介绍以下内容:

  • 程序实现SSH口令验证
  • SSH日志的删除
  • SSH日志的绕过

0x02 程序实现SSH口令验证


1.Python实现

使用第三方库paramiko库,用法很简单

我的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/sshCheck.py

代码支持口令登录和证书文件登录

2.C#实现

使用第三方库SSH.NET,地址如下:

https://github.com/sshnet/SSH.NET

编译好的dll下载地址:

https://github.com/sshnet/SSH.NET/releases/download/2016.1.0/SSH.NET-2016.1.0-bin.zip

参考文档:

https://github.com/sshnet/SSH.NET/releases/download/2016.1.0/SSH.NET-2016.1.0-help.chm

在程序中引入Renci.SshNet.dll后,用法也十分简单

在编写程序上需要注意以下问题:

(1)使用证书登录

SSH.NET对证书的格式有要求,SSH.NET-2016.1.0-help.chm上提示必须为BEGIN RSA PRIVATE KEY,如下图

Alt text

而使用命令ssh-keygen -t rsa时,默认是以新的格式生成密钥文件,格式为BEGIN OPENSSH PRIVATE KEY,这里需要做一个转换

解决方法:

使用puttygen转换,下载地址:

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

选择Load导入密钥

导出方法:

Conversions->Export OpenSSH key

所以在编写程序上需要先读取证书的文件内容,判断格式是否正确

我的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpSSHCheck_SSH.NET.cs

代码需要对应.NET版本的Renci.SshNet.dll,可使用csc.exe进行编译,命令示例:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe SharpSSHCheck_SSH.NET.cs /r:Renci.SshNet.dll

代码支持口令登录和证书文件登录

0x03 SSH日志的删除


同SSH登录操作相关的日志有以下几个位置:

  • /var/log/btmp,记录错误的登录尝试,查询命令:lastb
  • /var/log/auth.log,记录认证成功的用户
  • /var/log/secure,记录与安全相关的日志信息
  • /var/log/lastlog,记录用户上次登录信息
  • /var/log/wtmp,记录当前和曾经登入系统的用户信息,查询命令:last
  • /var/run/utmp,记录当前正在登录系统的用户信息,查询命令:w
  • ~/.bash_history,记录从最开始至上一次登录所执行过的命令,查询命令:history

1.查看日志的内容

无法直接查看的需要使用strings命令

命令示例:

strings /var/log/wtmp

2.替换日志中的IP

使用sed命令替换指定的IP

命令示例:

utmpdump /var/log/wtmp |sed "s/192.168.112.151/1.1.1.1/g" |utmpdump -r >/tmp/wtmp11 &&\mv /tmp/wtmp11 /var/log/wtmp

将192.168.112.151修改为1.1.1.1

3.删除日志中的指定行

使用sed命令删除指定行

sed -i '/May 1 23:17:39/d' /var/log/auth.log

删除/var/log/auth.log中以”May 1 23:17:39”开头的行

4.躲避管理员w查看

需要使用logtamper

命令示例:

python logtamper.py -m 1 -u re4lity -i 192.168.0.188

通过修改文件/var/run/utmp实现

5.清除指定ip的登录日志

需要使用logtamper

命令示例:

python logtamper.py -m 2 -u re4lity -i 192.168.0.188

通过修改文件/var/log/wtmp实现

6.修改上次登录时间地点

需要使用logtamper

命令示例:

python logtamper.py -m 3 -u re4lity -i 192.168.0.188 -t tty1 -d 2014:05:28:10:11:12

通过修改文件/var/log/lastlog实现

7.清除当前会话使用的命令记录

在退出会话前执行:

history -r

0x04 SSH日志的绕过


如果我们使用SSH客户端(例如putty)进行登录,需要考虑日志清除,十分麻烦

这里给出一种绕过各种日志记录的方法:使用sftp、rsyn、scp等协议进行登录(notty)

这里给出两种实现方法:

在0x02中介绍的两个SSH口令验证程序(python和c#)正是使用了notty

我将口令验证程序加入了执行命令的功能,对应的代码地址如下:

Python实现:https://github.com/3gstudent/Homework-of-Python/blob/master/sshRunCmd.py

C#实现:https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpSSHRunCmd_SSH.NET.cs

代码均支持执行单个命令和交互式shell

分别选择交互式shell,执行以下命令获得连接类型:

ps -aux|grep sshd

此时的连接类型为notty,如下图

Alt text

注:

如果使用putty远程连接,此时的类型为pts/2,如下图

Alt text

经测试,使用notty,能够绕过以下日志:

  • /var/log/lastlog,记录用户上次登录信息
  • /var/log/wtmp,记录当前和曾经登入系统的用户信息,查询命令:last
  • /var/run/utmp,记录当前正在登录系统的用户信息,查询命令:w
  • ~/.bash_history,记录从最开始至上一次登录所执行过的命令,查询命令:history

0x05 防御检测


增强SSH守护程序,参考资料:

https://www.putorius.net/how-to-secure-ssh-daemon.html

notty连接的检测:

  1. 查看错误的登录尝试,查询命令:lastb,文件位置/var/log/btmp
  2. 查看认证成功的用户,文件位置/var/log/auth.log
  3. 查看tcp连接,查看命令:netstat -vatn

0x06 小结


本文介绍了SSH在渗透测试中的基础知识(日志删除和日志绕过),开源了4个实现代码(口令验证和命令执行),结合利用方法给出检测建议。


LEAVE A REPLY


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK