
차세대 방화벽 감사 및 우회 도구
v0.2
Fireaway는 차세대 방화벽의 레이어 7/AppID 검사 규칙과 데이터 손실 방지(DLP), 애플리케이션 인식 프록시와 같은 기타 심층 패킷 검사 방어 메커니즘을 감사, 우회 및 데이터 유출(exfiltration)하기 위한 도구입니다. 이러한 전술은 NGFW가 레이어 7 데이터를 필터링하기 위해 연결을 설정하도록 허용해야 한다는 원칙과, 인터넷 서핑과 같은 정상 사용자 트래픽으로 위장하여 통신 채널을 방화벽 로그 내에 숨기기 위해 애플리케이션을 스푸핑(spoofing)하는 원칙에 기반합니다. 데이터 손실 방지 도구를 우회하는 경우, Fireaway는 정규 표현식 트리거 및 기타 DLP 규칙과 일치하지 않는 작은 "청크(chunk)"로 데이터를 전송하고, 대부분의 DLP 기술이 검사하도록 설계되지 않은 합법적인 애플리케이션의 스푸핑된 HTTP 헤더에 데이터를 삽입합니다. 또한 이 도구는 애플리케이션 헤더를 스푸핑하고 그 안에 데이터를 숨기는 기능을 통해 이상 탐지 및 휴리스틱(heuristics) 엔진을 무력화하는 데 성공했습니다.
FireAway 서버 시작하기: 일반적으로 FireAway 서버는 방화벽의 이그레스(egress) 측(예: 인터넷상의 서버)에서 시작되며, 어떤 애플리케이션 기반 규칙이 이 포트에서 트래픽을 허용하는지 확인하거나 DLP 또는 애플리케이션 프록시가 식별할 수 있는지 확인하기 위해 원시 데이터 청크를 수신하기 위해 닫혀 있을 것으로 예상되는 포트에서 수신 대기합니다.
python fa_server.py <수신할 포트> <모드 번호>
서버는 네 가지 모드로 시작할 수 있습니다:
테스트 모드(모드 0) - 순차적으로 전송된 데이터 또는 무작위로 생성된 테스트 데이터를 수신합니다. 데이터는 수신된 그대로 기록되며 재조립이 필요하지 않습니다.
순차 청크 수신(모드 1) - 클라이언트가 정의한 청크 크기로 하나 이상의 서버에 순차적으로 데이터가 전송됩니다. fa_server는 출력에 청크가 수신된 타임스탬프를 기록하고, 재조립 시 순서 키로 수신 시간을 사용합니다. 또한 fa_assembler.py와 함께 사용할 "재조립 키(reassembly key)"가 서버에 의해 생성됩니다. 이는 청크 사이의 구분자로 사용되는 무작위 4자리 키로, 전송되는 데이터 청크에 이 문자가 존재하지 않을 것이라는 가정에 기반합니다.
무작위 청크 수신(모드 2) - 하나 이상의 서버에 무작위 순서로 데이터가 전송됩니다. 이 모드는 클라이언트가 풀(pool) 내의 임의의 서버에 "시퀀스 키(sequence key)" 메시지를 전송하는 것에 의존합니다. 각 서버를 시작할 때 서버는 "시퀀스 키 식별자"를 입력하라는 메시지를 표시합니다. 이는 전송 중인 파일에 존재하지 않는 패턴이어야 하며, 서버가 연결을 통해 수신된 데이터를 시퀀스 키로 올바르게 식별할 수 있도록 합니다. 모든 서버에서 동일한 시퀀스 키 식별자를 사용해야 합니다! 클라이언트는 시퀀스 키를 전송할 서버를 무작위로 선택하므로, 모든 서버가 수신 데이터에서 시퀀스 키를 찾을 수 있는 것이 중요합니다. 시퀀스 키는 수신 서버에 의해 'SequenceKey.txt' 파일에 기록됩니다.
스푸핑된 앱 청크 수신(모드 3) - 합법적인 애플리케이션을 스푸핑하는 HTTP 헤더 내부에 Base64로 인코딩된 데이터가 하나 이상의 서버로 전송됩니다. 이 모드는 fa_assembler 스크립트와 함께 사용할 "재조립 키"도 생성합니다.
지정된 포트에서 서버가 수신한 모든 데이터는 서버가 시작된 디렉터리의 ReceivedData.txt 파일에 저장됩니다. 서버가 수신된 데이터 양의 차이(방화벽 필터링이 작동했음을 나타냄)를 감지하면 이 출력이 서버 콘솔에 표시됩니다:
두 번 연속 실행에서 동일하거나 더 적은 양의 데이터를 수신했습니다. 테스트 데이터를 전송 중인 경우 최대 데이터 누출 크기에 도달했을 수 있습니다.
FireAway 클라이언트/애플리케이션 스푸퍼 시작하기: FireAway 클라이언트에는 세 가지 모드가 있습니다:
테스트 모드(모드 0) - 레이어 7 제어가 작동하여 트래픽 흐름을 중지할 때까지 얼마나 많은 데이터를 전송할 수 있는지 확인하기 위해 점진적으로 증가하는 청크 크기로 무작위 데이터를 전송합니다.
순차 유출 모드(모드 1) - 파일을 열고 지정된 크기의 청크로 전송합니다. 데이터는 순차적으로 전송됩니다.
무작위 유출 모드(모드 2) - 파일을 열고 지정된 크기의 청크로 전송하지만 무작위 순서로 전송합니다. 이 모드를 사용할 때 클라이언트는 시퀀스 키 식별자를 묻습니다. 이는 원격 서버에서 지정한 값이며, 클라이언트는 생성된 시퀀스 키에 식별자를 태그(tag)합니다. 이 키는 파일 전송 전에 목록이 제공된 경우 임의의 서버로 전송되거나 지정된 서버 IP로 전송됩니다.
기본 클라이언트를 시작하려면:
python fa_client.py <FireAway 서버 IP 또는 서버 목록 파일 경로> <Fireaway 서버 포트> <클라이언트 모드>
서버 목록은 각 줄에 하나의 IP 주소가 있는 간단한 텍스트 파일이어야 합니다. 하나의 서버만 사용하는 경우 단일 IP를 대신 지정할 수 있습니다.
애플리케이션 스푸핑 클라이언트에는 세 가지 모드가 있습니다:
테스트 모드(모드 0) - 레이어 7 제어가 작동하여 트래픽 흐름을 중지할 때까지 얼마나 많은 데이터를 전송할 수 있는지 확인하기 위해 점진적으로 증가하는 청크 크기로 HTTP 헤더 내부에 무작위 테스트 데이터를 전송합니다.
Base64 인코딩 유출 모드(모드 1) - 입력 파일을 Base64로 인코딩하고 인코딩된 파일의 조각을 무작위로 생성된 HTTP 헤더 내에 전송하여 DLP를 우회하고 전송을 합법적인 애플리케이션으로 위장합니다.
애플리케이션 스푸핑 클라이언트를 시작하려면:
python fa_spoof.py <FireAway 서버 IP 또는 서버 목록 파일 경로> <Fireaway 서버 포트> <클라이언트 모드>
애플리케이션 스푸핑은 데이터 청크와 함께 합법적으로 보이는 애플리케이션 헤더(예: Facebook, LinkedIn 등) 내에 무작위로 HTTP 헤더를 삽입하여 다양한 애플리케이션으로 로그를 오염시키고 데이터 유출을 위장합니다.
Fireaway 재조립기: Fireaway 재조립기(fa_assembler.py)는 Fireaway 서버가 수신한 데이터를 재조립하는 데 사용됩니다. 이 재조립기에는 데이터를 수신한 서버의 모드에 해당하는 세 가지 모드가 있습니다:
모드 1 - 서버가 모드 1에서 수신한 데이터를 순차적 순서로 재조립합니다. 재조립기는 각 서버의 수신 데이터가 포함된 파일에 대한 재조립 키를 지정하라는 메시지를 표시합니다. 이 키는 서버가 시작될 때 생성되어 표시된 무작위 값입니다. 이 값은 수신된 청크가 있는 파일을 검사하고 처음 네 문자를 확인하여 찾을 수도 있습니다.
모드 2 - 서버가 모드 2에서 수신한 데이터를 무작위 순서로 재조립합니다. 재조립기는 전송 중 임의의 서버가 클라이언트로부터 수신한 시퀀스 키의 경로를 묻습니다. 또한 각 파일에 대한 재조립 키를 입력하라는 메시지를 표시합니다.
모드 3 - 스푸핑된 애플리케이션 HTTP 헤더에서 수신된 Base64로 인코딩된 데이터를 재조립합니다. 이 데이터는 모드 1과 마찬가지로 재조립 키를 묻습니다.
재조립기를 시작하려면:
python fa_assembler.py <재조립 모드> <재조립할 파일 경로(쉼표로 구분)>
출력은 지정된 파일 이름으로 저장됩니다.
문제나 질문은 Github을 통해 보고해 주세요.