51일차

●51일차(20250224051.php)
#리버싱
cuckoo 웹사이트에서 exe 파일을 분석할 것이다
> win10에 dev C++을 다운로드 해주자

x64 디버그 > release > exe 파일 다운로드 > 바탕화면에 벌레 두마리 생김

D://2025_Malware > P1 ~ P10까지 폴더를 생성해줌

컴파일 버전 > TDM-GCC 4.9.2 32bit Debug

1. 파일 정보 수집
파일 > 새로만들기 > 프로젝트 > Console Application(프로젝트명: P1), 언어는 C언어 > 기본코드가 나옴

> compile 클릭 > P1에서 확인 > exe 파일이 생김 > cuckoo에 넣어서 분석

> 파일 해시, 문서 특성이 나옴

sudo apt -y install libfuzzy-dev
sudo apt -y install swig
python2 -m pip install pydeep
python2 -m pip install m2crypto==0.24.0 (x)
ssdb를 확인할 수 있다

2. 정적 분석
static Analysis 클릭 > compile된 시간이 나옴

> PE 구조: Portable Executable
> 쿠쿠에서 구조를 불러왔기 때문에 시간을 알 수 있는것
> PEview를 다운로드하자(0.9.9 버전)

P1의 PE Compile Time : 2025-02-23 19:40:12
P1의 impehash : 4144b4faf65604a977e926d2625581c7

P2의 Compile Time : 2025-02-23 21:20:54
P2의 impehash : 4144b4faf65604a977e926d2625581c7

> 시간은 다르지만 해시값은 같다
> main.c의 코드(내용)를 바꿔서 다시 올려도 해시값이 같다
> 이유는 main.c의 코드의 헤더가 같기 때문
> 네트워크를 연결하는 소켓 프로그램을 추가하면 헤더가 달라진다
> 소켓 프로그램은 잘 쓰지 않는다
> impehash값이 달라지게 되고 달라진 값에 따라 악성코드임을 유추하는것
> exe 파일은 소스코드를 보지 않은 이상 어떤 프로그램인지 알 수 없다
> 쿠쿠를 이용해서 어떤 프로그램인지 유추하자는 것

3. 소켓
왼쪽이 서버 오른쪽이 클라이언트
> Chat gpt에 소켓 프로그램을 만들어달라고 부탁하면 서버 프로그램과 클라이언트 프로그램이 나오게 된다

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define PORT 8080
#define MAX_CONNECTIONS 5

int main() {
    WSADATA wsaData;
    SOCKET serverSocket, clientSocket;
    struct sockaddr_in serverAddr, clientAddr;
    int clientAddrSize = sizeof(clientAddr);
    char buffer[1024] = {0};

    // Winsock 초기화
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        printf("WSAStartup failed\n");
        return -1;
    }

    // 서버 소켓 생성
    if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
        printf("Socket creation failed\n");
        WSACleanup();
        return -1;
    }

    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(PORT);

    // 바인딩
    if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        printf("Bind failed\n");
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    // 연결 대기
    if (listen(serverSocket, MAX_CONNECTIONS) == SOCKET_ERROR) {
        printf("Listen failed\n");
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    printf("Server waiting for connections...\n");

    // 클라이언트 연결 수락
    if ((clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrSize)) == INVALID_SOCKET) {
        printf("Accept failed\n");
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    printf("Client connected\n");

    // 클라이언트로부터 메시지 받기
    int bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0);
    if (bytesReceived == SOCKET_ERROR) {
        printf("Receive failed\n");
        closesocket(clientSocket);
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }
    printf("Client: %s\n", buffer);

    // 응답 전송
    const char *response = "Hello from server!";
    send(clientSocket, response, strlen(response), 0);

    // 소켓 닫기
    closesocket(clientSocket);
    closesocket(serverSocket);
    WSACleanup();

    return 0;
}
> 프로젝트 > 프로젝트 옵션 > 매개변수틀 > linker에 -lwsock32를 추가
> main.c에 코드를 짜고 컴파일을 해서 다시 쿠쿠에 집어넣으면 해시값이 달라진다
PE Imphash : 2ab23750ec1638ca4e878e42fa1526c3


> 이러한 구조는 악성코드일 확률이 높다
> 일반 코드는 소켓을 사용하지 않음

> cmd에 가서 P2.exe를 돌리자
D:
cd 2025_Malware
cd P2
P2.exe


4. 악성코드
kali에서 악성코드를 빼서 쿠쿠로 분석해보자

> kali 악성 코드에도 소켓에 관한 내용이 들어가 있는 것을 확인할 수 있다.

#win7에서 악성코드를 실행
> 근데 호스트 전용 어댑터라 network analysis에 해커의 IP(192.168.0.201)를 볼 수가 없어
> 잠시 풀어줄거임

1. 방화벽 해제
[수정전]
sudo iptables -t nat - A POSTROUTING -o ens33 -s 192.168.56.0/24 -j MASQUERADE
> 네트워크 어댑터란 우분투에서 ifconfig를 치면 나오는 ens33 or vboxnet0을 말한다

sudo iptables -t nat -A POSTROUTING -o ens33 -s 192.168.56.0/24 -j MASQUERADE
sudo iptables -P FORWARD DROP
sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -s 192.168.56.0/24 -j ACCEPT
sudo iptables -A FORWARD -s 192.168.56.0/24 -d 192.168.56.0/24 -j ACCEPT
sudo iptables -A FORWARD -j LOG
sudo iptables -L -v

sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1

sudo netfilter-persistent save
sudo cat /etc/iptables/rules.v4
ping google.com
> 우분투에 적용

[수정후]
sudo iptables -A FORWARD -o ens33 -i vboxnet0 -s 192.168.56.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A POSTROUTING -t nat -j MASQUERADE

​ echo 1 | sudo tee -a /proc/sys/net/ipv4/ip_forward
sudo sysctl -w net.ipv4.ip_forward=1

​ sudo apt install iptables-persistent -y
sudo netfilter-persistent save
sudo netfilter-persistent reload
> 우분투에 적용

> win7 에서 ping google.com or ping 8.8.8.8
> 근데 안됨
> ip를 고정으로 주고 게이트웨이도 주자
> 192.168.56.101/24 192.168.56.1
> 8.8.8.8로 ping이 감

2. 악성코드 분석
> kali에서 대기모드
> 굳이 win7에 악성코드를 넣는것이 아니라 쿠쿠 웹에 악성코드를 올리자
> jango를 통해서 쿠쿠가 win7으로 악성코드를 분석하라고 보낸다
> 그때 잠시 미터프리터와 연결되고


> 분석이 끝나면 미터프리터가 끊기면서 결과가 나온다


> 결과 파일을 다운로드 받으면 와이어샤크 파일이 나온다

#플라스크 사용법 익히기
은행서버 및 쿠쿠와 연동
아파치 + 플라스크 연동
Nginx + 플라스크 연동
> 본인 컴퓨터에 flask 세팅
> 일단 C:\에 venvs와 projects 폴더를 만들어주자
> cmd 창에서 명령어들 실행

1. C:\venvs (가상환경)
cd C:\venvs
python -m venv mysite
> venvs 아래에 mysite라는 폴더가 생김

cd C:\venvs\mysite\Scripts
activate
pip install Flask

venvs 아래에 mysite.txt를 만들어주자
----------------------------------
@echo off
cd c:/projects/flask
set FLASK_APP=security
set FLASK_ENV=development
c:/venvs/mysite/scripts/activate
----------------------------------
> 확장자 cmd로 변경

윈도우 검색창 > 시스템 환경 변수 편집
고급 > 환경변수 > PC1에 대한 사용자 변수 > Path > 편집 > 새로만들기 > c:\venvs

cmd를 들어가서 mysite를 하면 경로 앞에 (mysite)가 생김

2. C:\projects (소스개발)
project 아래에 flask 폴더 만들어주고

cd C:\projects\flask
flask run
> 웹이 띄워짐

C:\projects\flask\security.py
[security.py]

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
	return "Hello"
> flask run > 웹에 hello가 뜸

C:\projects\flask\init.py
[init.py]

from flask import Flask

def create_app():
	app = Flask(__name__)

	@app.route('/')
	def index():
		return "Hello"
	return app
> 만들어주고 security.py 지워줌
> init이 security.py 역할을 한다


> hello가 뜸

flask 경로

> __pycache__ 디렉토리는 flask run을 해주면 생긴다