WINNIE

WINNIE는 국내 개발자 정진호 외 4명이 개발한 윈도우 기반 퍼저이다.

Harness 자동 제작은 물론 fork() 기술을 이용하여 빠른 퍼징을 수행한다.

 

 

개발 배경

  • 퍼저는 대부분 리눅스 기반이다. 물론 윈도우 기반 퍼저 역시 존재하지만 당면한 과제가 있다.
  • 윈도우의 특성, 즉 비공개 소스, GUI 과다사용, 프로세스 복제 능력 부족 등으로 인해 퍼징 개발에 어려움을 주고 있는 실정이다.
  • 결과적으로 윈도우 바이너리에서 61개의 버그를 발견하는 데 성공하였다.

 

기존 Window 퍼저와 차이점

  • 2.2배 더 많은 프로그램 수 지원
  • 3.9배 더 많은 프로그램 상태 파악 지원
  • 26.6배 더 빠른 실행 능력

 

 

Window 퍼징 당면 과제

  • 사용자가 프로그램을 종료해도 그 프로세스는 종료되지 않음
  • GUI 지원으로 인한 비교적 떨어지는 복제 성능
  • 비공개 소스 기반으로 인해내부 맥락을 추측하기 어려움

 

기존 솔루션

  • GUI 의도적인 미사용과 파싱 추출, 하지만 소스 코드를 모르기 때문에 효과가 크지 않음
  • 입력 파서에서 Loop돌리기, 하지만 전역 프로그램 상태와 충돌할 수 있기에 불안정함

 

 

WINNIE만의 솔루션

  • Harness generation 이용
  • 리눅스의 fork() 메카니즘 차용
  • 하이브리드 분석과 Fullspeed 이용

자세히 살펴보면 먼저,

1) Harness generation

 

Trace Collector

프로그램의 API 콜이나 리턴값을 수집함

 

  • 메인 프로그램, 라이브러리 그리고 Window API를 대상으로 모니터링 수행
  • 상호 간 호출 발생 시 해당 정보를 덤프 뜸

Target Extractor

어느 곳에 퍼징을 시도할 지, 대상을 식별함

 

  • Run Trace 정보를 통해 컨트롤 흐름표를 재구성함
  • 퍼징이 먹힐 만한 대상을 식별함
  • 가령, 메인프로그램은 최초에 타겟이됨, 그리고 ReadFile을 수행하는 윈도우 API가 그 다음이 타겟으로 설정될 수 있음

Harness Builder

최종 입력 값을 만들어냄

  • 이미지 뷰어에 이미지 파일과 텍스트 파일을 입력한 뒤,
    그에 대한 결과 값을 통해 로직 정보를 파악 할 수 있었음
  • 호출된 API 이름을 식별하는 등의 분석 이후에 코드의 윤곽(Skeleton)을 생성함
  • 지금까지의 과정을 토대로 만들어진 하네스 후보 중 하나를 선택함

2) Fork()

리눅스 프로세스 복제 기술을 윈도우에 가져옴

  • 부모 프로세스에서 자식 프로세스를 파생시킨다
  • 이후 csrss 서브 시스템을 통해 자식 프로세스를 관리한다
  • 자식 프로세스에서는 할당된 변수를 해제하는 것을 반복한다
  • csrss.exe : 윈도우 시스템에 기본으로 동작되는 프로세스로, 클라이언트 요청에 대한 작업자 스레드를 만들거나 삭제하는 MS 프로그램

3) Fullspeed Fuzzing

Code Coverage 수집을 목적으로 함

  • 각 각 의 베이직 블락마다 브레이크 포인트를 걸어둠
  • 브레이크 포인트 마다 충돌이 생기는 지 모니터링함
  • 충돌이 생기지 않는 곳에는 브레이크 포인트를 해제하고 모니터링을 미수행함
  • 점진적으로 충돌을 찾기 위해 위 행동을 반복함

 

WINAFL vs WININE

 

 

성과 및 오픈 소스 주소

오픈소스 : https://github.com/sslab-gatech/winnie

 

 

마무리

기존 윈도우 기반 퍼저인 AFL과 비교하여 월등한 성과를 보여준 WINNIE를 알게되었다.

여러므로 성능이 향상된 윈도우 퍼저이니, 앞으로 윈도우 퍼징을 할 기회가 온다면 WINNIE를 사용해보자!

 

 

참조

VPC란?

AWS내에서 영역을 2개로 나누어 하나는 외부에서 접속가능한반면 나머지 영역은 접근을 막는다.가령 웹서버는 public영역에 두고 DB서버는 private에 둠으로써 보안의 이점을 얻을 수 있다.

 

VPC에서..

VPC에서 다음 4개만 기억하자!

  • 서브넷 : 하나의 VPC내에서 각 각 public과 private에게 할당할 네트워크 대역을 의미함
  • 라우팅테이블 : public 영역 내 PC가 인터넷 게이트웨이와 연결할 수 있도록 해줌, 또는 private와 연결
  • 인터넷 게이트웨이 : VPC와 외부간의 연결을 위한 게이트웨이를 의미함
  • 네트워크 ACL : public, private 각 영역의 방화벽 개념이라고 이해하자

 

EC2에서..

각 각 public, private로 생성해주자

중요한 것은 public용 인스턴스는 반드시 public 서브넷 IP를 줄 것

 

 

결과

  • public 인스턴스로의 접속 성공! private으로는 접속안됨~

 

  • public 인스턴스에서만 접속 할 수 있음
$ sudo ssh -i ./fasoo.pem ubuntu@10.0.1.208

 

마무리

클라우드 보안에 핵심 기술인 VPC를 알아 보았다!

 

 

참조

ELK란?

"ELK"는 Elasticsearch, Logstash 및 Kibana, 이 오픈 소스 프로젝트 세 개의 머리글자입니다. 

Elasticsearch는 검색 및 분석 엔진입니다. Logstash는 여러 소스에서 동시에 데이터를 수집하여 변환한 후 Elasticsearch 같은 “stash”로 전송하는 서버 사이드 데이터 처리 파이프라인입니다. 

Kibana는 사용자가 Elasticsearch에서 차트와 그래프를 이용해 데이터를 시각화할 수 있게 해줍니다.

 

https://www.elastic.co/kr/what-is/elk-stack

 

ELK Stack: Elasticsearch, Logstash, Kibana

ELK Stack이란 무엇인가요? ELK Stack은 널리 알려진 세 개의 오픈 소스 프로젝트인 E=Elasticsearch(Lucene 기반), L=Logstash, K=Kibana의 머리글자를 합친 것입니다. Beats가 추가되어 이제 ELK Stack을 Elastic Stack이

www.elastic.co

 

설치 환경

◾ AWS EC2, Ubuntu Server 20.04 LTS (64비트 x86)

ELK 5.4.3 버전

 

설치 과정

◾ 자바 설치

$sudo apt update && sudo apt install openjdk-8-jdk -y
$javac -version
javac 1.8.0_292

$which javac
/usr/bin/javac

 

◾ 환경변수 설정

$readlink -f /usr/bin/javac
/usr/lib/jvm/java-8-openjdk-amd64/bin/javac

$sudo vi /etc/profile
  unset i
fi
...
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$HOME:$JAVA_HOME/bin
...

$source /etc/profile

 

◾ ELK 설치파일 다운로드

$cd ~
$wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.3.deb
$wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.3.deb
$wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.3-amd64.deb
$wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.3-amd64.deb

 

◾ 설치

$sudo dpkg -i elasticsearch-5.4.3.deb
$sudo dpkg -i logstash-5.4.3.deb
$sudo dpkg -i kibana-5.4.3-amd64.deb
$sudo dpkg -i filebeat-5.4.3-amd64.deb​

dpkg lock에러시

ㄴ더보기

$sudo rm /var/lib/apt/lists/lock

$sudo rm /var/cache/apt/archives/lock

$sudo rm /var/lib/dpkg/lock*

$sudo dpkg --configure -a

$sudo apt update

출처 : https://enant.tistory.com/18

 

◾ elasticsearch 설정 파일 수정 

$sudo vi /etc/elasticsearch/elasticsearch.yml
...
network.host: 0.0.0.0 #원격 접속 허용
...

 

◾ kibana 설정 파일 수정

$sudo vi /etc/kibana/kibana.yml
...
server.host 0.0.0.0
...

 

fileabeat 설정 파일 수정

$sudo vi /etc/filebeat/filebeat.yml
...
- input_type: log

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
	- /var/log/syslog        #전반적인 시스템 로그   
	- /var/log/apache2/*.log #아파치 웹 로그를 elasticsearch에게 전달
...

 

◾ ELK 실행 및 확인

$sudo systemctl start elasticsearch
$sudo systemctl start logstash
$sudo systemctl start kibana
$sudo systemctl start filebeat

$sudo systemctl enable elasticsearch #재부팅시 자동 실행
$sudo systemctl enable logstash
$sudo systemctl enable kibana
$sudo systemctl enable filebeat

$sudo systemctl status elasticsearch
$sudo systemctl status logstash
$sudo systemctl status kibana
$sudo systemctl status filebeat

 

웹서버 로그 시각화를 위해 Apache2 설치 및 실행

$sudo apt-get install apache2 -y

$sudo systemctl start apache2
$sudo systemctl enable apache2
$sudo systemctl status apache2

 

결과

◾ filebeat가 elasticsearch에게 로그를 전달해주는 지 확인

http://[AWS IP]:9200/_cat/indices?v

 

 

kibana에 접속해서 결과 확인

http://[AWS IP]:5601/

AWS 우분투에 ELK Stack 설치 끝!

 

마무리

리눅스 시스템 내에서 동작하는 서비스들의 로그 저장 폴더를 지정해주면 다음과 같이 json형식으로 로그를 받아 시각화 시킬수있다!

 

 

참조

+ Recent posts