모의해킹 - 3 (교육 72일차)

SW·2023년 3월 8일
0

참고:
https://github.com/apsrcreatix/Socket-Programming-With-C/blob/master/03-tcp-ip-client-server/server.c

# vi server.c
/*
 * 파일명: server.c
 */

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <unistd.h>

int main()
{
  
    char serverMessage[256] = "You have a missed call from server\n";

    //create the server socket
    int socketDescriptor = socket(AF_INET,SOCK_STREAM,0);
  
    //define the server address
    //creating the address as same way we have created for TCPclient
    struct sockaddr_in serverAddress;
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(9002);
    serverAddress.sin_addr.s_addr = INADDR_ANY;

    //calling bind function to oir specified IP and port
    bind(socketDescriptor,(struct sockaddr*) &serverAddress,sizeof(serverAddress));

    listen(socketDescriptor,5);

    //starting the accepting 
    //accept(socketWeAreAccepting,structuresClientIsConnectingFrom,)
    int client_socket = accept(socketDescriptor, NULL, NULL);
  
    //sending data
    //send(toWhom,Message,SizeOfMessage,FLAG);
    send(client_socket,serverMessage,sizeof(serverMessage),0);

    //close the socket
    close(socketDescriptor);
    return 0;
}

/*
 * 파일명: client.c
 */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define SIZE 1000

//main functions
int main()
{
    int socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
    // server address
    struct sockaddr_in serverAddress;
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(9002);
    serverAddress.sin_addr.s_addr = INADDR_ANY;

    // communicates with listen
    connect(socketDescriptor, (struct sockaddr *)&serverAddress, sizeof(serverAddress));

    char serverResponse[SIZE];
    recv(socketDescriptor, &serverResponse, sizeof(serverResponse), 0);
    printf("Ther server sent the data : %s", serverResponse);

    //closing the socket
    close(socketDescriptor);

    return 0;
}

# gcc -o server server.c
# gcc -o client client.c

# systemctl stop firewalld
# systemctl disable firewalld

# ./server

다른 터미널에서 열린 포트를 확인한다.
# ss -nlt
State      Recv-Q Send-Q    Local Address:Port                   Peer Address:Port              
LISTEN     0      5                     *:9002                              *:*                  
LISTEN     0      128                   *:22                                *:*                  
LISTEN     0      100           127.0.0.1:25                                *:*                  
LISTEN     0      128                [::]:80                             [::]:*                  
LISTEN     0      128                [::]:22                             [::]:*                  
LISTEN     0      100               [::1]:25                             [::]:*   

# ./client 
Ther server sent the data : You have a missed call from server


소켓을 알아야하는 이유는
공격자가 악성코드를 이용해서 피해자를 연결하기 위해서는 소켓통신으로 연결되어 있기 때문이다.

소켓
- Client/Server 를 이해한다.

Bind Shell/Reverse Shell
- Bind Shell/Reverse Shell을 소켓에 넣는다.

어셈블리 코드
- Bind Shell/Reverse Shell 어셈블리 코드를 뽑아낸다.

쉘코드
- Bind Shell/Reverse Shell 쉘코드를 뽑아낸다.
- 취약점이 있는 곳에 사용한다.

실습> DNS 서버 설치하기

CentOS 7 victim3에서 설치한다.

포트: 53
질의: UDP 53, TCP 53(존 동기화, 질의할 때 UDP의 데이의 양이 많을 때 TCP로 변경)

bind : 
네임서버 패키지 
Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server

1. 패키지 설치
DNS 관련 패키지를 설치한다.
# yum -y install bind bind-chroot bind-utils

서버 재부팅 시 다시 네임서버를 시작하기 위해서 named를 활성화시킨다.
# systemctl enable named

네임서버를 시작한다.
# systemctl start named

네임서버가 잘 실행되었는지 확인한다.
# systemctl status named
# yum -y install net-tools
# ss -nltu
# netstat -nltup

2. 설정 파일 수정
네임서버 전체 설정 파일: /etc/named.conf
도메인 설정 파일: /etc/named.rfc1912.zones

listen-on port :
any; 로 설정하면 모든 IP주소가 53번 포트가 열리게 된다.
IP주소가 1개만 있으면 상관이 없지만 any; 로 설정하면 모든 IP주소에 53번 포트가 열리게 되므로 
특정 IP주소만 열릴 수 있도록 설정하는 것이 좋다.

listen-on-v6 port 53 : IPv6 에 해당하므로 사용하지 않는다.

allow-query : 
도메인 질의를 허용하는 클라이언트를 적는다. any라고 하면 아무곳에서나 접속해서 도메인에 대한 질의를 허용하는 것이다. 
그래서 일반적으로 allow-query는 any로 둔다.

dnssec-enable, dnssec-validation:
DNS 보안에 관련된 내용이지만 연습서버이므로 모두 no 로 설정한다.
# vi /etc/named.conf 
// listen-on port 53 { 200.200.200.6; 127.0.0.1; };
listen-on port 53 { any; };
// listen-on-v6 port 53 { ::1; };
allow-query     { any; };
recursion yes;
dnssec-enable no; 
dnssec-validation no;     

설정 파일을 수정 후 네임서버를 재시작하고 포트번호를 확인한다.
# systemctl reload named
# netstat -nltup
# ss -nltup

3. 방화벽 설정
# systemctl stop firewalld
# systemctl disable firewalld

# yum -y install iptables-services
# systemctl disable iptables

4. 도메인 등록

도메인을 설정하는 순서
1. /etc/named.rfc1912.zones 파일에 도메인을 등록한다.
2. /var/named/<정방향존파일>을 생성 후 설정한다.
3. named-checkconf, named-checkzone 명령어로 설정파일과 존파일을 문법을 검사한다.
4. systemctl restart named, systemctl reload named 명령어로 네임서버를 리로드한다.
5. nslookup, dig, host 명령어로 도메인을 확인한다.

/etc/named.rfc1912.zones 파일에 도메인을 등록한다.
등록하는 형식은 아래처럼 등록해야 한다.

zone "도메인명" IN {
    type 네임서버종류;
    file "포워드존파일";
    allow-update { none; };
};

존파일: 도메인에 대한 정보를 가지고 있는 파일
포워드 존파일 (정방향 존파일): 도메인을 요청했을 때 IP주소 정보를 저장하고 있는 파일
리버스 존파일 (역방향 존파일): IP주소 정보를 요청했을 때 도메인 정보를 저장하고 있는 파일


sbs.com, kbs.com, mbc.com 도메인을 등록한다.
# vi /etc/named.rfc1912.zones 
  :
  :(생략)
zone "sbs.com" IN { type master; file "sbs.com.zone"; allow-update { none; }; }; 
zone "kbs.com" IN { type master; file "kbs.com.zone"; allow-update { none; }; };
zone "mbc.com" IN { type master; file "mbc.com.zone"; allow-update { none; }; };

포워드 존파일 생성
/var/named/<정방향존파일>을 생성 후 설정한다.
/etc/named.conf: directory "/var/named";
/etc/named.rfc1912.zones: file "sbs.com.zone";
sbs.com 의 포워드 존파일: /var/named/sbs.com.zone
# cd /var/named

# cp -a named.localhost sbs.com.zone
# vi sbs.com.zone
$TTL 300
@       IN   SOA  ns1  root (2022092701 21600 1800 1209600 180)
        IN   NS   ns1
        IN   A    200.200.200.6
ns1     IN   A    200.200.200.6
www     IN   A    200.200.200.6

# cp -a sbs.com.zone kbs.com.zone
# cp -a kbs.com.zone mbc.com.zone

5. 네임서버 시작
설정파일에 문제가 없는지 확인하고 이상이 없을 경우 재시작 한다.
named-checkconf: 설정파일을 체크하는 명령어
- 설정 파일에 문제가 없으면 아무것도 출력되지 않고 에러가 발생하면 에러를 출력한다.
named-checkzone: 존 파일을 체크하는 명령어
- 설정 파일에 문제가 없으면 serial(버전)과 OK가 출력되고 에러가 발생하면 에러를 출력한다.
# named-checkconf  
# named-checkzone sbs.com sbs.com.zone 
zone sbs.com/IN: loaded serial 2022092701
OK
# named-checkzone kbs.com kbs.com.zone 
zone kbs.com/IN: loaded serial 2022092701
OK
# named-checkzone mbc.com mbc.com.zone 
zone mbc.com/IN: loaded serial 2022092701
OK

네임서버를 리로드한다.
# systemctl reload named

6. 도메인 질의

# cat /etc/resolv.conf 
# Generated by NetworkManager
search linuxmaster.net
nameserver 168.126.63.1
nameserver 168.126.63.2


# nslookup sbs.com
Server:		168.126.63.1
Address:	168.126.63.1#53

Non-authoritative answer:
Name:	sbs.com
Address: 107.22.178.157

# dig sbs.com +short
107.22.178.157

nslookup과 dig을 이용해서 도메인을 질의하면 결과는 200.200.200.6이 나온다.
# nslookup sbs.com 127.0.0.1
# nslookup kbs.com 127.0.0.1
# nslookup mbc.com 127.0.0.1

# dig @127.0.0.1 sbs.com +short
# dig @127.0.0.1 kbs.com +short
# dig @127.0.0.1 mbc.com +short

실습> recursion 변경하기

이 설정을 통해서 외부에 질의하지 못하게 가상으로 설정할 수 있다.
recursion: 설정된 DNS서버에서 등록된 도메인이 아니면 외부 DNS에서 검색하는 기능이다.

외부에 질의를 하지 못하게 recursion을 no 로 수정한다.
recursion yes -> no
# vi /etc/named.conf
recursion no;

# systemctl reload named

네임서버를 임시적으로 자기 자신으로 변경한다.
# vi /etc/resolv.conf
nameserver 127.0.0.1

외부로 나가는지 테스트한다.
- 자신이 등록한 도메인 sbs.com, kbs.com, mbc.com 이외에는 응답을 하지 않는다.
# dig sbs.com +short
200.200.200.6
# dig kbs.com +short
200.200.200.6
# dig mbc.com +short
200.200.200.6

naver.com, ytn.com 처럼 네임서버에 설정되지 않은 도메인일 경우 외부로 나가지 못하므로 아무것도 출력되지 않는다.
# dig naver.com +short
# dig ytn.com +short

실습> Kali Linux 네임서버 변경하기

168.126.63.1, 168.126.63.2 -> 200.200.200.6으로 변경한다.

DNS 변경 전
[root@kali ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 168.126.63.1
nameserver 168.126.63.2

[root@kali ~]# dig sbs.com +short
107.22.178.157

[root@kali ~]# dig kbs.com +short
141.193.213.10
141.193.213.11

[root@kali ~]# dig mbc.com +short
162.209.18.56

DNS 변경 후
[root@kali ~]# vi /etc/resolv.conf 
# Generated by NetworkManager
nameserver 200.200.200.6

[root@kali ~]# dig sbs.com kbs.com mbc.com +short
200.200.200.6
200.200.200.6
200.200.200.6

200.200.200.6 DNS 서버에서 recursion 설정이 no 로 되어 있으므로
외부로 나가지 못하므로 아무것도 출력되지 않는다.
[root@kali ~]# dig daum.net  +short
[root@kali ~]# dig naver.com +short
[root@kali ~]# dig linuxmaster.net +short

실습> DNS zone transfer 공격

sbs.com 도메인이 외부로 나가는지 확인한다.
- 외부로 나간다면 DNS 설정을 다시 확인한다.
[root@kali ~]# dig sbs.com +short
200.200.200.6

DNS zone transfer 공격에 의해서 sbs.com 의 포워드 존파일을 모두 가져온다.
zone transfer: zone 에 설정된 내용을 전송(2차 네임서버에만 전송해야 된다.)
- bind 네임서버를 설치하면 기본값은 zone transfer가 열려있다.
[root@kali ~]# dig sbs.com axfr

; <<>> DiG 9.18.4-2-Debian <<>> sbs.com axfr
;; global options: +cmd
sbs.com.		300	IN	SOA	ns1.sbs.com. root.sbs.com. 2022092701 21600 1800 1209600 180
sbs.com.		300	IN	NS	ns1.sbs.com.
sbs.com.		300	IN	A	200.200.200.6
ns1.sbs.com.		300	IN	A	200.200.200.6
www.sbs.com.		300	IN	A	200.200.200.6
sbs.com.		300	IN	SOA	ns1.sbs.com. root.sbs.com. 2022092701 21600 1800 1209600 180
;; Query time: 0 msec
;; SERVER: 200.200.200.6#53(200.200.200.6) (TCP)
;; WHEN: Tue Sep 27 01:37:59 EDT 2022
;; XFR size: 6 records (messages 1, bytes 211)

host를 이용한 경우
[root@kali ~]# host sbs.com
sbs.com has address 200.200.200.6

[root@kali ~]# host -l sbs.com
sbs.com name server ns1.sbs.com.
sbs.com has address 200.200.200.6
ns1.sbs.com has address 200.200.200.6
www.sbs.com has address 200.200.200.6


C:\Users\user>nslookup
기본 서버:  ns.lgdacom.net
Address:  164.124.101.2
> server 200.200.200.6
> set type=any
> ls -d sbs.com
[[200.200.200.6]]
 sbs.com.                       SOA    ns1.sbs.com root.sbs.com. (2022092701 21600 1800 1209600 180)
 sbs.com.                       NS     ns1.sbs.com
 sbs.com.                       A      200.200.200.6
 ns1                            A      200.200.200.6
 www                            A      200.200.200.6
 sbs.com.                       SOA    ns1.sbs.com root.sbs.com. (2022092701 21600 1800 1209600 180)

실습> zone transfer 로그 확인하기

zone transfer 를 실행하면 네임서버쪽에 관련 로그 /var/log/messages 가 남겨진다.
!!! 주의 !!!
그러므로 외부 사이트에 공격을 하면 안된다. 

1. 로그 모니터링
# cd
# > /var/log/messages 
# tail -f /var/log/messages 

2. 공격 시도
[root@kali ~]# dig axfr sbs.com

; <<>> DiG 9.18.8-1-Debian <<>> axfr sbs.com
;; global options: +cmd
sbs.com.		300	IN	SOA	ns1.sbs.com. root.sbs.com. 2022092701 21600 1800 1209600 180
sbs.com.		300	IN	NS	ns1.sbs.com.
sbs.com.		300	IN	A	200.200.200.6
ns1.sbs.com.		300	IN	A	200.200.200.6
www.sbs.com.		300	IN	A	200.200.200.6
sbs.com.		300	IN	SOA	ns1.sbs.com. root.sbs.com. 2022092701 21600 1800 1209600 180
;; Query time: 0 msec
;; SERVER: 200.200.200.6#53(200.200.200.6) (TCP)
;; WHEN: Tue Mar 07 20:19:56 EST 2023
;; XFR size: 6 records (messages 1, bytes 211)

3. 로그 확인
# tail -f /var/log/messages 
Mar  7 08:26:55 localhost named[58491]: client @0x7f1fc40b9fb0 200.200.200.3#34901 (sbs.com): transfer of 'sbs.com/IN': AXFR started (serial 2022092701)
Mar  7 08:26:55 localhost named[58491]: client @0x7f1fc40b9fb0 200.200.200.3#34901 (sbs.com): transfer of 'sbs.com/IN': AXFR ended

실습> zone transfer 허용 금지하기 (1st)

zone transfer 허용을 금지 시키는 두 가지 방법
첫 번째 방법: /etc/named.rfc1912.zones 설정 파일에서 도메인 영역마다 허용을 금지 시키는 경우
두 번째 방법: /etc/named.conf 전체 설정 파일에서 허용을 금지 시키는 경우


생략: 허용, allow-transfer가 생략이 되면 기본값은 any
allow-transfer { any; };  : 모두 허용
allow-transfer { none; }; : 모두 거부 
allow-transfer { 2차네임서버IP주소; }; : 2차 네임서버만 허용하고 모두 거부

첫 번째 방법을 이용하는 경우
- 도메인이 여러 개 있을 경우 각 도메인별로 설정을 할 수 있다.

1. 설정파일 수정
zone transfer 허용을 금지 시키는 설정을 한다.
[root@victim3 ~]# vi /etc/named.rfc1912.zones 
  :
  :(생략)
zone "sbs.com" IN { type master; file "sbs.com.zone"; allow-update { none; }; allow-transfer { none; }; }; 
zone "kbs.com" IN { type master; file "kbs.com.zone"; allow-update { none; }; allow-transfer { none; }; };
zone "mbc.com" IN { type master; file "mbc.com.zone"; allow-update { none; }; allow-transfer { none; }; };

2. 네임서버 리로드
네임서버의 설정이 변경되었으므로 네임서버를 리로드한다.
[root@victim3 ~]# systemctl reload named

3. 로그파일 모니터링
[root@victim3 ~]# > /var/log/messages
[root@victim3 ~]# tail -f /var/log/messages

4. 공격 시도
DNS zone transfer를 공격한다.
[root@kali ~]# dig sbs.com axfr

; <<>> DiG 9.18.4-2-Debian <<>> sbs.com axfr
;; global options: +cmd
; Transfer failed.

[root@kali ~]# dig kbs.com axfr

; <<>> DiG 9.18.4-2-Debian <<>> kbs.com axfr
;; global options: +cmd
; Transfer failed.

[root@kali ~]# dig mbc.com axfr

; <<>> DiG 9.18.4-2-Debian <<>> mbc.com axfr
;; global options: +cmd
; Transfer failed.

5. 로그 확인
[root@victim3 ~]# tail -f /var/log/messages
Sep 27 14:54:44 victim3 named[3970]: client @0x7f4e480d3050 200.200.200.3#33987 (sbs.com): zone transfer 'sbs.com/AXFR/IN' denied
Sep 27 14:57:32 victim3 named[3970]: client @0x7f4e4ae70e60 200.200.200.3#38415 (kbs.com): zone transfer 'kbs.com/AXFR/IN' denied
Sep 27 14:57:38 victim3 named[3970]: client @0x7f4e4aeae3a0 200.200.200.3#39513 (mbc.com): zone transfer 'mbc.com/AXFR/IN' denied

실습> zone transfer 허용 금지하기 (2nd)

zone transfer 허용을 금지 시키는 두 가지 방법
첫 번째 방법: /etc/named.rfc1912.zones 설정 파일에서 도메인 영역마다 허용을 금지 시키는 경우
두 번째 방법: /etc/named.conf 전체 설정 파일에서 허용을 금지 시키는 경우

생략: 허용, allow-transfer가 생략이 되면 기본값은 any
allow-transfer { any; };  : 모두 허용
allow-transfer { none; }; : 모두 거부 
allow-transfer { 2차네임서버IP주소; }; : 2차 네임서버만 허용하고 모두 거부

두 번째 방법을 이용하는 경우
- /etc/named.conf 전체 설정 파일에서 허용을 금지 시키는 경우

1. 설정파일 수정
[root@victim3 ~]# vi /etc/named.rfc1912.zones 
zone "sbs.com" IN { type master; file "sbs.com.zone"; allow-update { none; }; }; 
zone "kbs.com" IN { type master; file "kbs.com.zone"; allow-update { none; }; };
zone "mbc.com" IN { type master; file "mbc.com.zone"; allow-update { none; }; };

2. 네임서버 리로드
네임서버의 설정이 변경되었으므로 네임서버를 리로드한다.
[root@victim3 ~]# systemctl reload named


3. 공격 시도
3개의 도메인에 zone transfer를 모두 허용했기 때문에 존 파일 정보가 출력된다.
[root@kali ~]# dig axfr sbs.com
[root@kali ~]# dig axfr kbs.com
[root@kali ~]# dig axfr mbc.com

4. 설정파일 수정
/etc/named.conf 파일에서 한번의 설정으로 전체 도메인에 적용될 수 있도록 설정한다.
[root@victim3 ~]# vi /etc/named.conf
     allow-query     { any; };
     allow-transfer { none; };          

5. 네임서버 리로드
네임서버의 설정이 변경되었으므로 네임서버를 리로드한다.
[root@victim3 ~]# systemctl reload named


6. 로그파일 모니터링
[root@victim3 ~]# > /var/log/messages
[root@victim3 ~]# tail -f /var/log/messages

7. 공격 시도
DNS zone transfer를 공격한다.
[root@kali ~]# dig sbs.com axfr

; <<>> DiG 9.18.4-2-Debian <<>> sbs.com axfr
;; global options: +cmd
; Transfer failed.

[root@kali ~]# dig kbs.com axfr

; <<>> DiG 9.18.4-2-Debian <<>> kbs.com axfr
;; global options: +cmd
; Transfer failed.

[root@kali ~]# dig mbc.com axfr

; <<>> DiG 9.18.4-2-Debian <<>> mbc.com axfr
;; global options: +cmd
; Transfer failed.

8. 로그 확인
공격자의 zone transfer 공격을 네임서버가 허용 금지로 설정했기 때문에 denied 로 로그가 기록 되었다.
[root@localhost ~]# tail -f /var/log/messages 
Mar  7 08:51:17 localhost named[58491]: client @0x7f1fc40b9fb0 200.200.200.3#39809 (sbs.com): zone transfer 'sbs.com/AXFR/IN' denied
Mar  7 08:51:20 localhost named[58491]: client @0x7f1fc57bd160 200.200.200.3#44057 (kbs.com): zone transfer 'kbs.com/AXFR/IN' denied
Mar  7 08:51:23 localhost named[58491]: client @0x7f1fc4070bd0 200.200.200.3#33031 (mbc.com): zone transfer 'mbc.com/AXFR/IN' denied

실습> DNS 공격툴을 이용한 DNS 정보 얻어오기

참고: https://www.kali.org/tools/dnsenum/

이 공격을 하는 이유는 무엇인가?
DNS Zone Transfer가 막혀있기 때문에 도메인을 하나씩 질의해서 DNS에 대한 정보를 얻어오는 것이다.

1. 사용법 확인
[root@kali ~]# dnsenum 
dnsenum VERSION:1.2.6
Usage: dnsenum [Options] <domain>
[Options]:
Note: If no -f tag supplied will default to /usr/share/dnsenum/dns.txt or
the dns.txt file in the same directory as dnsenum
GENERAL OPTIONS:
  --dnsserver 	<server>
			Use this DNS server for A, NS and MX queries.
  --enum		Shortcut option equivalent to --threads 5 -s 15 -w.
  -h, --help		Print this help message.
  --noreverse		Skip the reverse lookup operations.
  --nocolor		Disable ANSIColor output.
  --private		Show and save private ips at the end of the file domain_ips.txt.
  --subfile <file>	Write all valid subdomains to this file.
  -t, --timeout <value>	The tcp and udp timeout values in seconds (default: 10s).
  --threads <value>	The number of threads that will perform different queries.
  -v, --verbose		Be verbose: show all the progress and all the error messages.
GOOGLE SCRAPING OPTIONS:
  -p, --pages <value>	The number of google search pages to process when scraping names,
			the default is 5 pages, the -s switch must be specified.
  -s, --scrap <value>	The maximum number of subdomains that will be scraped from Google (default 15).
BRUTE FORCE OPTIONS:
  -f, --file <file>	Read subdomains from this file to perform brute force. (Takes priority over default dns.txt)
  -u, --update	<a|g|r|z>
			Update the file specified with the -f switch with valid subdomains.
	a (all)		Update using all results.
	g		Update using only google scraping results.
	r		Update using only reverse lookup results.
	z		Update using only zonetransfer results.
  -r, --recursion	Recursion on subdomains, brute force all discovered subdomains that have an NS record.
WHOIS NETRANGE OPTIONS:
  -d, --delay <value>	The maximum value of seconds to wait between whois queries, the value is defined randomly, default: 3s.
  -w, --whois		Perform the whois queries on c class network ranges.
			 **Warning**: this can generate very large netranges and it will take lot of time to perform reverse lookups.
REVERSE LOOKUP OPTIONS:
  -e, --exclude	<regexp>
			Exclude PTR records that match the regexp expression from reverse lookup results, useful on invalid hostnames.
OUTPUT OPTIONS:
  -o --output <file>	Output in XML format. Can be imported in MagicTree (www.gremwell.com)

2. 로그 모니터링
200.200.200.6에서 로그를 모니터링 한다.
[root@localhost ~]# > /var/log/messages
[root@localhost ~]# tail -f /var/log/messages

3. 공격 시도
[root@kali ~]# dnsenum --dnsserver 200.200.200.6 -f /usr/share/dnsenum/dns.txt sbs.com

4. 로그의 결과
공격자의 공격 로그가 아래처럼 기록된다.
[root@localhost ~]# tail -f /var/log/messages
Mar  7 09:31:52 localhost named[58491]: client @0x7f1fc57bd160 200.200.200.3#53871 (sbs.com): zone transfer 'sbs.com/AXFR/IN' denied
Mar  7 09:31:53 localhost named[58491]: client @0x7f1fc40625a0 200.200.200.3#48328 (0.200.200.200.in-addr.arpa): query (cache) '0.200.200.200.in-addr.arpa/PTR/IN' denied
Mar  7 09:31:53 localhost named[58491]: client @0x7f1fc40625a0 200.200.200.3#48328 (1.200.200.200.in-addr.arpa): query (cache) '1.200.200.200.in-addr.arpa/PTR/IN' denied
Mar  7 09:31:53 localhost named[58491]: client @0x7f1fc40625a0 200.200.200.3#48328 (2.200.200.200.in-addr.arpa): query (cache) '2.200.200.200.in-addr.arpa/PTR/IN' denied
Mar  7 09:31:53 localhost named[58491]: client @0x7f1fc40625a0 200.200.200.3#48328 (3.200.200.200.in-addr.arpa): query (cache) '3.200.200.200.in-addr.arpa/PTR/IN' denied
Mar  7 09:31:53 localhost named[58491]: client @0x7f1fc40625a0 200.200.200.3#48328 (4.200.200.200.in-addr.arpa): query (cache) '4.200.200.200.in-addr.arpa/PTR/IN' denied
  :
  :(생략)

5. 패킷 모니터링
200.200.200.6에서 패킷을 모니터링 하기 위해서 tcpdump 프로그램을 설치한다.
DNS를 내부로 돌렸기 때문에 yum2 프로그램을 만들어서 패키지를 설치한다.

[root@localhost ~]# mkdir bin
[root@localhost ~]# cd bin
[root@localhost ~]#  vi yum2 
-- yum2 --
#!/bin/sh
# 파일명: yum2
# 프로그램 설명: 외부 DNS로 변경하고 패키지를 설치한 후 내부 DNS로 변경한다.
# 작성자: 리눅스마스터넷

# 1. DNS 변경
cat << EOF > /etc/resolv.conf 
nameserver 168.126.63.1
EOF

# 2. 패키지 설치
# yum2 -y install tcpdump
# $@: -y install tcpdump
yum $@

# 3. DNS 복구
cat << EOF > /etc/resolv.conf 
nameserver 127.0.0.1
EOF
-- yum2 --

[root@localhost bin]# chmod 755 yum2 
[root@localhost bin]# cd
[root@localhost ~]# yum2 -y install tcpdump  
[root@localhost ~]# tcpdump -i ens33 udp port 53 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes

6. 공격 시도
NIC 인터페이스인 ens33에서 UDP port 53번을 모니터링한다
[root@kali ~]# dnsenum --dnsserver 200.200.200.6 -f /usr/share/dnsenum/dns.txt sbs.com


[root@localhost ~]# tcpdump -i ens33 udp port 53 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
09:42:58.899724 IP 200.200.200.3.60938 > 200.200.200.6.53: 32643+ A? sbs.com. (25)     
09:42:58.899942 IP 200.200.200.6.53 > 200.200.200.3.60938: 32643*- 1/1/1 A 200.200.200.6 (75) 
09:42:58.901389 IP 200.200.200.3.40568 > 200.200.200.6.53: 25718+ A? ekgbbzscsqix.sbs.com. (38) 
09:42:58.901524 IP 200.200.200.6.53 > 200.200.200.3.40568: 25718 NXDomain*- 0/1/0 (83) 
09:42:58.904055 IP 200.200.200.3.40270 > 200.200.200.6.53: 30833+ NS? sbs.com. (25) 
09:42:58.904144 IP 200.200.200.6.53 > 200.200.200.3.40270: 30833*- 1/0/1 NS ns1.sbs.com. (59) 
09:42:58.905210 IP 200.200.200.3.35047 > 200.200.200.6.53: 46102+ MX? sbs.com. (25) 
09:42:58.905259 IP 200.200.200.6.53 > 200.200.200.3.35047: 46102*- 0/1/0 (70) 
09:42:58.906075 IP 200.200.200.3.53264 > 200.200.200.6.53: 23462+ A? ns1.sbs.com. (29) 
09:42:58.906186 IP 200.200.200.6.53 > 200.200.200.3.53264: 23462*- 1/1/0 A 200.200.200.6 (59) 
09:42:58.906861 IP 200.200.200.3.59257 > 200.200.200.6.53: 19707+ AAAA? ns1.sbs.com. (29) 
  :
  :(생략)

실습> 사전파일을 이용한 공격

기본 사전파일은 약 10,000개 정도가 있기 때문에 좀더 많은 서브도메인을 확인할 수 있게
github에 공개되어 있는 사전파일을 다운로드 받는다.

사전 파일 다운로드
사전파일: https://github.com/rbsec/dnscan

1. 사전 파일 다운로드
DNS 정보를 수정하고 다운로드 받는다.
[root@kali ~]# vi /etc/resolv.conf 
# Generated by NetworkManager
#nameserver 200.200.200.6
nameserver 168.126.63.1

[root@kali ~]# git clone https://github.com/rbsec/dnscan.git

설치된 이후에 DNS 정보를 다시 수정한다.
[root@kali ~]# vi /etc/resolv.conf 
# Generated by NetworkManager
nameserver 200.200.200.6

2. 로그 모니터링
[root@localhost ~]# >  /var/log/messages 
[root@localhost ~]# tail -f  /var/log/messages 

3. 공격 시도
[root@kali ~]# cd dnscan
[root@kali dnscan]# wc -l subdomains-10000.txt
9985 subdomains-10000.txt

[root@kali dnscan]# dnsenum --dnsserver 200.200.200.6 -f subdomains-10000.txt  sbs.com
  
4. 로그 확인
[root@localhost ~]# tail -f  /var/log/messages 
  :
  :(생략)
Mar  7 10:02:35 localhost named[58491]: client @0x7f1fc40625a0 200.200.200.3#46692 (242.200.200.200.in-addr.arpa): query (cache) '242.200.200.200.in-addr.arpa/PTR/IN' denied
Mar  7 10:02:35 localhost named[58491]: client @0x7f1fc40625a0 200.200.200.3#46692 (243.200.200.200.in-addr.arpa): query (cache) '243.200.200.200.in-addr.arpa/PTR/IN' denied
Mar  7 10:02:35 localhost named[58491]: client @0x7f1fc40625a0 200.200.200.3#46692 (244.200.200.200.in-addr.arpa): query (cache) '244.200.200.200.in-addr.arpa/PTR/IN' denied
  :
  :(생략)

실습> 사전 파일을 다운로드하는 python 프로그램 제작하기

공격자 Kali Linux에서 실행한다.

1. 프로그램 제작
# cd 
vi -> :set mouse= -> i -> 붙여넣기
[root@kali ~]# vi gitDownload.py
#! /usr/bin/env python3
# 파일명: gitDownload.py
# 프로그램 설명: 외부 DNS를 설정하고 github에서 사전파일을 가져오고 DNS를 다시 복원한다.
# 작성자: 리눅스마스터넷
# 버전: 2023030801

import os

# 1. 변수 설정
resolvConf1    = '/etc/resolv.conf'
resolvConf2    = '/etc/resolv.conf.bak'
nameserverInfo = 'nameserver 168.126.63.1'
gitCommand     = 'git clone https://github.com/rbsec/dnscan.git .'
makeDirectory  = '/root/dnsDictAttack'

# 2. DNS 파일 복사
# 참고: 
# import shutil
# shutil.copyfile(src, dst)
# 
# 파일 제어 첫 번째 방법
#
# with문을 이용하는 방법
# 1. 파일 열기 
# 2. 파일 제어(읽기, 쓰기)
# with문을 이용해서 파일을 제어하면 자동으로 파일을 닫아준다.
with open(resolvConf1, 'rt') as src:
    with open(resolvConf2, 'wt') as dst:
        dst.write(src.read())

# 3. 외부 DNS 설정
# 파일 제어 두 번째 방법
# 전통적인 방법
# 1. 파일 열기 
# 2. 파일 제어(읽기, 쓰기)
# 3. 파일 닫기
src = open(resolvConf1, 'wt')
src.write(nameserverInfo)
src.close()

# 4. 사전 파일 다운로드
os.mkdir(makeDirectory)  # 디렉터리를 생성한다.
os.chdir(makeDirectory)  # 디렉터리를 이동한다.
os.system(gitCommand)    # git으로 사전파일을 다운로드 한다.

# 5. DNS 복원
# resolvConf2 파일을 resolvConf1으로 변경한다.
os.rename(resolvConf2, resolvConf1)

2. 실행
[root@kali ~]# chmod 755 gitDownload.py
[root@kali ~]# ln -s gitDownload.py gitDownload
[root@kali ~]# ./gitDownload
[root@kali ~]# cd ~/dnsDictAttack/

3. 확인
[root@kali dnsDictAttack]# ls
dnscan.py   LICENSE    requirements.txt      subdomains-1000.txt  subdomains-500.txt  subdomains-uk-1000.txt  suffixes.txt
Dockerfile  README.md  subdomains-10000.txt  subdomains-100.txt   subdomains.txt      subdomains-uk-500.txt   tlds.txt

실습> 서브 도메인 추가

1. 호스트명 변경
[root@localhost ~]# hostnamectl set-hostname victim3.linuxmaster.net
[root@localhost ~]# bash
[root@victim3 ~]# 

2. 서브 도메인 추가
[root@victim3 ~]# vi /var/named/sbs.com.zone 
$TTL 300
@       IN   SOA  ns1  root (2022093001 21600 1800 1209600 180)
        IN   NS   ns1
        IN   A    200.200.200.6
ns1     IN   A    200.200.200.6
www     IN   A    200.200.200.6
; 여기부터 추가
swa     IN   A    200.200.200.6
orion2  IN   A    200.200.200.6
esmtp   IN   A    200.200.200.6
220     IN   A    200.200.200.6
testlab IN   A    200.200.200.6
t7      IN   A    200.200.200.6
thot    IN   A    200.200.200.6
wien    IN   A    200.200.200.6

네임서버를 리로드 한다.
[root@victim3 ~]# systemctl reload named

3. 패킷 덤프
[root@victim3 ~]# tcpdump -i ens33 udp port 53 -nn --number

4. 공격 시도
[root@kali dnsDictAttack]# dnsenum -f subdomains-10000.txt sbs.com
dnsenum VERSION:1.2.6

-----   sbs.com   -----


Host's addresses:
__________________

sbs.com.                                 300      IN    A        200.200.200.6


Name Servers:
______________

ns1.sbs.com.                             300      IN    A        200.200.200.6


Mail (MX) Servers:
___________________



Trying Zone Transfers and getting Bind Versions:
_________________________________________________


Trying Zone Transfer for sbs.com on ns1.sbs.com ... 
AXFR record query failed: REFUSED


Brute forcing with subdomains-10000.txt:
_________________________________________

www.sbs.com.                             300      IN    A        200.200.200.6
ns1.sbs.com.                             300      IN    A        200.200.200.6
swa.sbs.com.                             300      IN    A        200.200.200.6
orion2.sbs.com.                          300      IN    A        200.200.200.6
esmtp.sbs.com.                           300      IN    A        200.200.200.6
220.sbs.com.                             300      IN    A        200.200.200.6
testlab.sbs.com.                         300      IN    A        200.200.200.6
t7.sbs.com.                              300      IN    A        200.200.200.6
thot.sbs.com.                            300      IN    A        200.200.200.6
wien.sbs.com.                            300      IN    A        200.200.200.6


sbs.com class C netranges:
___________________________

 200.200.200.0/24


Performing reverse lookup on 256 ip addresses:
_______________________________________________


0 results out of 256 IP addresses.


sbs.com ip blocks:
___________________


done.


5. 패킷 확인
[root@victim3 ~]# tcpdump -i ens33 udp port 53 -nn --number
  :
  :(생략)
23381  10:31:52.066068 IP 200.200.200.3.53125 > 200.200.200.6.53: 50661+ A? inventory.sbs.com. (35)
23382  10:31:52.066546 IP 200.200.200.6.53 > 200.200.200.3.53125: 50661 NXDomain*- 0/1/0 (80)
23383  10:31:52.067794 IP 200.200.200.3.35252 > 200.200.200.6.53: 27647+ A? sigma.sbs.com. (31)
23384  10:31:52.068227 IP 200.200.200.6.53 > 200.200.200.3.35252: 27647 NXDomain*- 0/1/0 (76)
23385  10:31:52.070160 IP 200.200.200.3.33354 > 200.200.200.6.53: 31217+ A? telecom.sbs.com. (33)
23386  10:31:52.070685 IP 200.200.200.6.53 > 200.200.200.3.33354: 31217 NXDomain*- 0/1/0 (78)
23387  10:31:52.072406 IP 200.200.200.3.57628 > 200.200.200.6.53: 2318+ A? formation.sbs.com. (35)
23388  10:31:52.073081 IP 200.200.200.6.53 > 200.200.200.3.57628: 2318 NXDomain*- 0/1/0 (80)
23389  10:31:52.076752 IP 200.200.200.3.59296 > 200.200.200.6.53: 60102+ A? ib.sbs.com. (28)
23390  10:31:52.077528 IP 200.200.200.6.53 > 200.200.200.3.59296: 60102 NXDomain*- 0/1/0 (73)
  :
  :(생략)

실습> DNS의 사전 파일 공격 프로그램 제작하기

참고:
https://docs.python.org/ko/3/library/os.html?highlight=os#module-os
https://docs.python.org/ko/3/library/pathlib.html#correspondence-to-tools-in-the-os-module

1. 사전파일 생성
자신의 홈디렉터리에 사전파일 dict.txt를 생성한다.
# cd
[root@kali ~]# cat << EOF > dict.txt
www
ns
swa
orion2
test
test2
EOF

2. 공격파일 생성
[root@kali ~]# vi dnsAttack.py
#! /usr/bin/python3

import os

os.system("pwd")
os.system("id")

[root@kali ~]# chmod 755 dnsAttack.py

[root@kali ~]# vi dnsAttack.py
#! /usr/bin/python3

import os

filename = 'dict.txt'
f = open(filename, 'r')      # 1. 파일 열기: dict.txt 파일을 읽기 권한으로 오픈한다.
hostname = f.readline()      # 2. 파일 읽기: 한 줄을 읽어서 hostname 변수에 저장한다.

while hostname:              # 값이 있으면 참, 없으면 거짓
    print(hostname, end='')  # 화면에 출력한다.(엔터키는 제거)
    #os.system(f'dig {hostname}.sbs.com +short')
    hostname = f.readline()  # 2. 파일 읽기: 한 줄을 읽어서 hostname 변수에 저장한다.

f.close()                    # 3. 파일 닫기


[root@kali ~]# ln -s dnsAttack.py dnsAttack
[root@kali ~]# ./dnsAttack
www



실습> gdb 연습하기

gdb(Gnu DeBugger)로 C, C++ 바이너리 파일을 분석할 때 사용한다.
화이트해커의 기본이다.

1. 패키지 설치
# yum2 -y install gdb gcc

2. 소스 작성
# vi gdbTest.c
/*
 * 파일명: gdbTest.c
 * 프로그램 설명: gdb를 이용한 디버깅 실습
 * 작성자: 리눅스마스터넷
 */

#include <stdio.h>

int main()
{
    int i = 1;   // i = 1
    int j = 2;   // j = 2
    int hap = i + j;  // hap = i + j 

    // print("i = %d, j = %d, hap = %d" %(i,j,hap)
    printf("i = %d, j = %d, hap = %d\n", i, j, hap);

    return 0;
}

3. 컴파일
-g 옵션을 이용해서 디버깅 정보가 바이너리에 포함된다.
# gcc -g -o gdbTest gdbTest.c 

# alias gdb='gdb -q'
# gdb gdbTest

b(Break): bp 설정
r(Run): 프로그램 실행
p(Print) 변수: 변수의 내용 출력
n(Next): 다음 코드로 실행
c(Continue): 프로그램 끝까지 실행
q(Quit): 종료

run: 프로그램 실행
(gdb) run
Starting program: /root/gdbTest 
i = 1, j = 2, hap = 3
[Inferior 1 (process 73282) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64

list: 소스코드를 확인한다. -g 옵션을 넣고 컴파일해야 소스코드가 출력된다.
(gdb) list
2	 * 파일명: gdbTest.c
3	 * 프로그램 설명: gdb를 이용한 디버깅 실습
4	 * 작성자: 리눅스마스터넷
5	 */
6	
7	#include <stdio.h>
8	
9	int main()
10	{
11	    int i = 1;   // i = 1
(gdb) 
12	    int j = 2;   // j = 2
13	    int hap = i + j;  // hap = i + j 
14	
15	    // print("i = %d, j = %d, hap = %d" %(i,j,hap)
16	    printf("i = %d, j = %d, hap = %d\n", i, j, hap);
17	
18	    return 0;
19	}

break: BP를 설정한다. main()함수에 Break Point를 설정한다.
(gdb) break main
Breakpoint 1 at 0x400535: file gdbTest.c, line 11.

r: run의 줄임말로 프로그램을 실행한다.
(gdb) r
Starting program: /root/gdbTest 

Breakpoint 1, main () at gdbTest.c:11
11	    int i = 1;   // i = 1

next: 다음 코드를 실행한다.
(gdb) next
12	    int j = 2;   // j = 2

print: 변수를 출력한다.
(gdb) print i
$1 = 1

n: next의 줄임말로 다음 코드를 실행한다.
(gdb) n
13	    int hap = i + j;  // hap = i + j

p: print의 줄임말로 변수를 확인한다.
(gdb) p j
$2 = 2

(gdb) n
16	    printf("i = %d, j = %d, hap = %d\n", i, j, hap);
(gdb) p hap
$3 = 3

(gdb) n
i = 1, j = 2, hap = 3
18	    return 0;

c: contunue의 줄임말로 끝까지 실행한다. (BP가 없으면 프로그램이 종료된다.)
(gdb) c
Continuing.
[Inferior 1 (process 73520) exited normally]
(gdb) q

실습> pdb 연습하기

1. 패키지 설치
[root@kali ~]# vi /etc/resolv.conf 
nameserver 168.126.63.1
#nameserver 200.200.200.6

[root@kali ~]# pdb ./dnsAttack
Command 'pdb' not found, but can be installed with:
apt install python-dev-is-python3
Do you want to install it? (N/y)y   <-- y를 누르면 python-dev-is-python3 패키지가 설치된다.
apt install python-dev-is-python3
Reading package lists... Done
Building dependency tree... Done
  :
  :(생략)

2. 소스 분석
[root@kali ~]# pdb ./dnsAttack
> /root/dnsAttack.py(3)<module>()
-> import os
(Pdb) l
  1  	#! /usr/bin/python3
  2  	
  3  ->	import os
  4  	
  5  	filename = 'dict.txt'
  6  	f = open(filename, 'r')
  7  	hostname = f.readline()
  8  	
  9  	while hostname:
 10  	    #print(hostname, end='')
 11  	    print(f'dig {hostname}.sbs.com +short')
(Pdb) 엔터
 12  	    hostname = f.readline()
 13  	
 14  	f.close()
[EOF]

(Pdb) n
> /root/dnsAttack.py(5)<module>()
-> filename = 'dict.txt'

(Pdb) n
> /root/dnsAttack.py(6)<module>()
-> f = open(filename, 'r')

(Pdb) p filename
'dict.txt'

(Pdb) n
> /root/dnsAttack.py(7)<module>()
-> hostname = f.readline()

(Pdb) n
> /root/dnsAttack.py(9)<module>()
-> while hostname:
(Pdb) p hostname
'www\n'

(Pdb) n
> /root/dnsAttack.py(11)<module>()
-> print(f'dig {hostname}.sbs.com +short')

(Pdb) c
  :
  :

(Pdb) q

3. 네임서버 변경
[root@kali ~]# vi /etc/resolv.conf 
nameserver 200.200.200.6


한 줄에 포함된 엔터(\n)를 제거한다.
[root@kali ~]# python3
Python 3.10.8 (main, Nov  4 2022, 09:21:25) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> hostname = 'www\n'
>>> hostname
'www\n'
>>> hostname.split('\n')
['www', '']
>>> quit()


최종 변경된 코드
[root@kali ~]# vi ./dnsAttack

#! /usr/bin/python3

import os

filename = 'dict.txt'
f = open(filename, 'r')
hostname = f.readline()

while hostname:
    # 한 줄의 끝에는 엔터(\n)가 있으므로 엔터를 기준으로 나누어서 hostname 변수에 저장한다.
    hostname = hostname.split('\n')
    print(hostname[0], ':') 
    os.system(f'dig {hostname[0]}.sbs.com +short')
    hostname = f.readline()

f.close()

[root@kali ~]# ./dnsAttack
www :
200.200.200.6
ns :
swa :
200.200.200.6
orion2 :
200.200.200.6
test :
test2 :

실습> Kali Linux에서 VSCode 설치하기

참고: https://cafe.naver.com/linuxmasternet/1208

1. 네임서버 변경
[root@kali ~]# vi /etc/resolv.conf 
nameserver 168.126.63.1
#nameserver 200.200.200.6


2. VSCode 설치
파이어폭스를 실행해서 https://code.visualstudio.com/ 사이트로 접속해서 VSCode를 다운로드 받는다.

다운로드가 완료되면 /root/Downloads 디렉터리로 이동해서 dpkg로 데비안 패키지를 설치한다.
[root@kali Downloads]# dpkg -i code_1.76.0-1677667493_amd64.deb 
Selecting previously unselected package code.
(Reading database ... 395636 files and directories currently installed.)
Preparing to unpack code_1.76.0-1677667493_amd64.deb ...
Unpacking code (1.76.0-1677667493) ...
Setting up code (1.76.0-1677667493) ...
Processing triggers for desktop-file-utils (0.26-1) ...
Processing triggers for mailcap (3.70+nmu1) ...
Processing triggers for shared-mime-info (2.2-1) ...

3. kali 로그인
Xwindow 를 kali 사용자로 로그인한다.
아이디: kali
비밀번호: kali

4. VSCode 실행
메뉴에서 code를 실행한다.
워크스페이스 폴더를 선택한다.

5. 파이썬 파일 실행
소스코드를 작성해서 실행한다.

-- hello.py --
print("Hello Python!")
-- hello.py --

실습> VSCode 에서 실행

1. 사전 파일 생성
VSCode 에서 작성한다.
-- dict.txt --
www
ns
swa
orion2
test
test2
EOF
-- dict.txt --

2. 공격 코드 생성
-- dnsAttack.py --
#! /usr/bin/python3

import os

filename = 'dict.txt'
f = open(filename, 'r')
hostname = f.readline()

while hostname:
    # 한 줄의 끝에는 엔터(\n)가 있으므로 엔터를 기준으로 나누어서 hostname 변수에 저장한다.
    hostname = hostname.split('\n')
    print(hostname[0], ':') 
    os.system(f'dig {hostname[0]}.sbs.com +short')
    hostname = f.readline()

f.close()
-- dnsAttack.py --

3. 실행 및 분석
VSCode를 실행해서 분석한다.

실습> Kali Linux 한글 설치하기

각자 구글에서 Kali Linux 한글 설치로 검색해서 Kali Linux 에서 한글을 설치한다.

실습> dnsmap 소스코드 다운로드

Kali Linux에서 공격코드는 
C언어, Perl, Python으로 작성되어 있다.

최신 Kali Linux 버전은 Python2로 제작된 소스코드들을 모두 Python3로 교체했다.

dnsmap은 C언어로 작성되어 있다.

1. Source Code Repository 접속
참고: 
https://www.kali.org/tools/dnsmap/#dnsmap-1
Source Code Repository 를 클릭하면 github 사이트로 이동한다.

2. 외부 DNS 변경
[root@kali ~]# vi /etc/resolv.conf
nameserver 168.126.63.1

3. 소스코드 다운로드
git을 이용해서 소스코드 저장소에서 다운로드 받는다.
[root@kali ~]# mkdir dnsmap
[root@kali ~]# cd dnsmap
[root@kali dnsmap]# git clone https://salsa.debian.org/pkg-security-team/dnsmap.git .

4. 컴파일
autoconf 패키지를 설치한다.
[root@kali dnsmap]# apt-get -y install autoconf
[root@kali dnsmap]# ./autogen.sh 
[root@kali dnsmap]# ./configure 
[root@kali dnsmap]# make

5. 소스코드 분석 및 수정
[root@kali dnsmap]# cd src
[root@kali src]# vi dnsmap.c 
  :
  :(생략)
int main(int argc, char *argv[]) {

    printf(">>> dnsmap 분석 <<<\n");  // 추가
	unsigned short int i=0, j=0, k=0, l=0, found=0, ipCount=0, filtIPcount=0, milliseconds=10, intIPcount=0,

  :
  :(생략)

6. 컴파일
[root@kali src]# make
gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT dnsmap.o -MD -MP -MF .deps/dnsmap.Tpo -c -o dnsmap.o dnsmap.c
mv -f .deps/dnsmap.Tpo .deps/dnsmap.Po
gcc  -g -O2   -o dnsmap dnsmap.o  

7. 실행
[root@kali src]# ./dnsmap
>>> dnsmap 분석 <<<  <-- 새로 추가한 메세지가 출력된다.
dnsmap 0.36 - DNS Network Mapper

usage: dnsmap <target-domain> [options]

options:
-w <wordlist-file>
-r <regular-results-file>
-c <csv-results-file>
-d <delay-millisecs>
-i <ips-to-ignore> (useful if you're obtaining false positives)

e.g.:
dnsmap example.com
dnsmap example.com -w yourwordlist.txt -r /tmp/domainbf_results.txt
dnsmap example.com -r /tmp/ -d 3000
dnsmap example.com -r ./domainbf_results.txt

8. 내부 DNS로 변경
[root@kali src]# cat /etc/resolv.conf 
nameserver 200.200.200.6

[root@kali src]# dig sbs.com +short
200.200.200.6

[root@kali src]# dig naver.com +short

실습> dnsmap 공격

1. 패킷 모니터링
[root@victim3 ~]# tcpdump -i ens33 udp port 53 -nn --number

2. DNS 확인
[root@kali src]# cat /etc/resolv.conf 
nameserver 200.200.200.6

[root@kali src]# dig sbs.com +short
200.200.200.6

3. dnsmap 공격
dnsmap으로 공격할 때 사전파일을 지정하지 않으면 기본 사전파일로 공격을 진행한다.
[root@kali src]# dnsmap sbs.com 
dnsmap 0.36 - DNS Network Mapper

[+] searching (sub)domains for sbs.com using built-in wordlist
[+] using maximum random delay of 10 millisecond(s) between requests

ns1.sbs.com
IP address #1: 200.200.200.6

www.sbs.com
IP address #1: 200.200.200.6

[+] 2 (sub)domains and 2 IP address(es) found
[+] completion time: 9 second(s)

4. 패킷 모니터링 확인
[root@victim3 ~]# tcpdump -i ens33 udp port 53 -nn --number
  :
  :(생략)
 5939  06:28:22.369646 IP 200.200.200.3.40597 > 200.200.200.6.53: 56890+ AAAA? zz.sbs.com. (28)
 5940  06:28:22.369789 IP 200.200.200.6.53 > 200.200.200.3.40597: 56890 NXDomain*- 0/1/0 (73)
 5941  06:28:22.370760 IP 200.200.200.3.54063 > 200.200.200.6.53: 8636+ A? zz.sbs.com. (28)
 5942  06:28:22.370905 IP 200.200.200.6.53 > 200.200.200.3.54063: 8636 NXDomain*- 0/1/0 (73)

실습> 경로 추적

경로추적
tracert: 윈도우 OS 명령어
traceroute: 리눅스 OS 명령어

C:\Users\user2>tracert

사용법: tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout]
               [-R] [-S srcaddr] [-4] [-6] target_name

옵션:
    -d                 주소를 호스트 이름으로 확인하지 않습니다.
    -h maximum_hops    대상 검색을 위한 최대 홉 수입니다.
    -j host-list       host-list에 따라 원본 라우팅을 완화합니다(IPv4 에만 해당).
    -w timeout         각 응답의 대기 시간 제한(밀리초)입니다.
    -R                 왕복 경로를 추적합니다(IPv6에만 해당).
    -S srcaddr         사용할 원본 주소입니다(IPv6에만 해당).
    -4                 IPv4를 사용합니다.
    -6                 IPv6을 사용합니다.

C:\Users\user>tracert -d google.com

최대 30홉 이상의
google.com [172.217.161.46](으)로 가는 경로 추적:

  1    <1 ms     1 ms    <1 ms  192.168.20.1
  2     *        *        *     요청 시간이 만료되었습니다.
  3     2 ms     1 ms     3 ms  10.204.161.109
  4     2 ms     1 ms     2 ms  1.213.9.229
  5     2 ms     2 ms     3 ms  1.208.147.5
  6     3 ms     3 ms     2 ms  1.208.165.157
  7     3 ms     4 ms     3 ms  1.208.115.81
  8    45 ms    44 ms    45 ms  61.42.0.118
  9    40 ms    40 ms    40 ms  1.208.148.206
 10    38 ms    38 ms    39 ms  74.125.118.154
 11    38 ms    39 ms    38 ms  108.170.241.97
 12    39 ms    38 ms    38 ms  108.170.241.112
 13    41 ms    41 ms    42 ms  172.253.64.172
 14    65 ms    65 ms    65 ms  172.253.66.71
 15    63 ms    63 ms    63 ms  142.250.213.15
 16    62 ms    60 ms    61 ms  142.250.212.148
 17    59 ms    59 ms    59 ms  108.170.242.129
 18    61 ms    61 ms    61 ms  216.239.41.71
 19    64 ms    64 ms    64 ms  172.217.161.46

추적을 완료했습니다.


https://ipinfo.io/


NAT 환경에서는 안된다.
[root@kali ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:dc:0b:b6 brd ff:ff:ff:ff:ff:ff
    inet 200.200.200.3/24 brd 200.200.200.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::290a:b024:cc09:d56d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

[root@kali ~]# traceroute -n google.com
traceroute to google.com (142.251.42.206), 30 hops max, 60 byte packets
 1  200.200.200.2  0.110 ms  0.091 ms  0.112 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
^C

############
📌 포트 스캔 📌
############

!!! 우리가 구축한 가상의 환경이 아닌 외부에 포트 스캔을 하면 법에 걸린다. 반드시 우리가 구축한 가상의 환경에서 한다. !!!

시스템 내부에서 동작중인 서비스 확인 : netstat, ss
시스템 외부에서 동작중인 서비스 확인 : port scanning
-허가된 사용자: 내부에서 변조된 netstat, ss 명령어를 대체할 수 있기 때문에 시스템 내부에서 발견하지 못한 포트를 확인할 수 있다.
-허가되지 않은 사용자: 공격이라고 판단해야 한다.

실습> 포트 스캔

포트 스캔이란
외부에서 서버의 열린 서비스 포트를 확인하는 정보수집 공격이다.
사용하는 사람에 따라서 좋게 사용될 수도 있도 나쁘게 사용될 수도 있다.
-허가된 사용자, 허가되지 않은 사용자

1. victim 방화벽 중지

victim3.linuxmaster.net: 200.200.200.6

[root@victim3 ~]# systemctl stop firewalld
[root@victim3 ~]# systemctl disable firewalld
[root@victim3 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  


2. 포트 스캔
DNS를 내부로 돌리고 sbs.com 도메인을 확인한다.
[root@kali ~]# vi /etc/resolv.conf 
# Generated by NetworkManager
nameserver 200.200.200.6

[root@kali ~]# dig sbs.com +short
200.200.200.6

-p: 포트 옵션 
-p 옵션을 사용하지 않으면 가장 잘 알려진 포트 1,000개를 스캔한다.
포트는 2byte 이므로 (2^16 65536개 0~65535) 그 중에서 1,000개를 스캔한다. 
사용법: nmap 도메인 or nmap IP주소
[root@kali ~]# nmap sbs.com  <-- namp 200.200.200.6과 동일하다.
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-03 22:24 EDT
Nmap scan report for sbs.com (200.200.200.6)
Host is up (0.00018s latency).
Not shown: 995 closed tcp ports (reset)
PORT     STATE SERVICE
22/tcp   open  ssh
53/tcp   open  domain
80/tcp   open  http
MAC Address: 00:0C:29:3D:BF:69 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.24 seconds

전체 포트를 스캔한다. 
0번은 사용하지 않으므로 1 부터 65,535까지 스캔한다.
[root@kali ~]# nmap -p1-65535 sbs.com
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-03 22:28 EDT
Nmap scan report for sbs.com (200.200.200.6)
Host is up (0.00059s latency).
Not shown: 65530 closed tcp ports (reset)
PORT     STATE SERVICE
22/tcp   open  ssh
53/tcp   open  domain
80/tcp   open  http
111/tcp  open  rpcbind
8888/tcp open  sun-answerbook
MAC Address: 00:0C:29:F9:34:CB (VMware)

Nmap done: 1 IP address (1 host up) scanned in 14.81 seconds

server.py는 8000번 포트를 띄운다.
# python3 server.py 

[root@kali ~]# nmap -p1-65535 sbs.com
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-08 03:12 EST
Nmap scan report for sbs.com (200.200.200.6)
Host is up (0.00092s latency).
Not shown: 65531 closed tcp ports (reset)
PORT     STATE SERVICE
22/tcp   open  ssh
53/tcp   open  domain
80/tcp   open  http
8000/tcp open  http-alt   <--
MAC Address: 00:0C:29:3D:BF:69 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 14.62 seconds

-p 8000 을 이용해서 8000번만 검사한다.
[root@kali ~]# nmap -p 8000 200.200.200.6
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-08 03:14 EST
Nmap scan report for 200.200.200.6
Host is up (0.00023s latency).

PORT     STATE SERVICE
8000/tcp open  http-alt
MAC Address: 00:0C:29:3D:BF:69 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.19 seconds

실습> 포트 번호 1234번 테스트

Attacker: 200.200.200.3
Victim: 200.200.200.6

  Attacker               Victim
+----------+          +----------+
|          |          |          |
|          |    S     |          |
|  52852 -----------> |   1234   |
|          |          |          |
|          |          |          |
+----------+          +----------+
     .3                    .6
          200.200.200.0/24

-- 조건 --
1. Victim에 방화벽은 없다. 
-- 조건 --


1. 포트 확인
Victim# ss -nlt|grep 1234
Victim#  <-- 프롬프트가 바로 떠지면 1234 포트가 열려있지 않다는 것이다.

2. 패킷 모니터링
# tcpdump -i ens33 port 1234 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes

3. 포트 스캔
[root@kali ~]# nmap -p 1234 200.200.200.6
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-08 03:29 EST
Nmap scan report for 200.200.200.6
Host is up (0.00022s latency).

PORT     STATE  SERVICE
1234/tcp closed hotline
MAC Address: 00:0C:29:3D:BF:69 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.18 seconds


       S
A -----------> V3 (패킷이 들어오는 것)
       R
A <----------- V3 

닫힌 포트일 경우
- 포트가 닫혔다면 RST 패킷이 Victim(200.200.200.6)에서 Attacker(200.200.200.3)에 전송된다.
Victim# tcpdump -i ens33 port 1234 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
16:12:28.379442 IP 200.200.200.3.34671 > 200.200.200.6.1234: Flags [S], seq 3355718159, win 1024, options [mss 1460], length 0
16:12:28.379466 IP 200.200.200.6.1234 > 200.200.200.3.34671: Flags [R.], seq 0, ack 3355718160, win 0, length 0


열린 포트일 경우

[root@kali ~]# nmap -p 80 200.200.200.6
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-08 03:33 EST
Nmap scan report for 200.200.200.6
Host is up (0.00023s latency).

PORT   STATE SERVICE
80/tcp open  http
MAC Address: 00:0C:29:3D:BF:69 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.19 seconds

       S
A -----------> V3 (패킷이 들어오는 것)
      S/A
A <----------- V3 
       R
A -----------> V3 

# tcpdump -i ens33 port 80 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
16:16:54.903100 IP 200.200.200.3.58642 > 200.200.200.6.80: Flags [S], seq 873426058, win 1024, options [mss 1460], length 0
16:16:54.903129 IP 200.200.200.6.80 > 200.200.200.3.58642: Flags [S.], seq 318231695, ack 873426059, win 29200, options [mss 1460], length 0
16:16:54.903381 IP 200.200.200.3.58642 > 200.200.200.6.80: Flags [R], seq 873426059, win 0, length 0
profile
정보보안 전문가

0개의 댓글