본문 바로가기

IT for researcher/Security

Defense and Detection Strategies against Internet worms 5장

Construction of a Worm


인텔 i386 플랫폼, 리눅스 아파치 서버에 감염시키는 Slapper 웜을 분석하여 웜의 생성구조를 살펴본다.

5.1 Target Selection
웜을 디자인할 때 첫 번째 해야할 일은 공격하고 이용할 대상을 결정하는 일이다. 
두가지를 고려해야 한다. 첫째, 웜이 사용할 플랫폼 선택해야한다. 둘째, 웜이 원격의 시스템을 어떻게 공격할 지 선택해야한다.

5.1.1 Target platform
공격을 시도하는 영역이 인터넷이라면 윈도우 시스템에 대한 공격은 많은 호스트에 영향을 줄 수 있을 것이다. 이는 인터넷을 사용하는 대부분의 클라이언트는 윈도우 환경이기 때문이다. 이와 반대로 유닉스 서버는 네임서버 파일서버와 같이 인터넷 백본을 구성하는 요소로 많이 사용되고 있다. BIND 취약점과 같은 인프라 소프트웨어의 취약점들은 지난 3년간 나타나고 빠르게 퍼지고 있다. 이 공격 루트는 좀더 큰 공격을 할 수 있게 한다. 그러나 다양한 UNIX 계열이 존재 한다는것이 웜을 생성하는 가장 큰 어려움으로 생각된다. 아파치 웜인 경우, FreeBSD 아파치에 대해서만 유효하다. 전형적인 익스플로잇은 설령 할수 있더라도 많은 고려없이 모든 환경에서 실행될 수는 없다. 이로인해 많은 복잡성이 추가된다. 로직은 우선 호스트타입을 추론을 시작으로 수행된다. 

Slapper 웜은 다양한 리눅스를 핑거프린트 할수 있으며 공격할 수 있다. -- 다양한 리눅스와 아파치 버전을 나열함

아파치 웹서버에서의 취약점은 mod_ssl 패키지를 활성화 시켜야 발생된다. 아파치는 가장 많이 쓰이는 공짜 웹서버!!
Slapper는 대략 30000서버정도를 감염 시킬수 있었다.

5.1.2 Vulnerability selection
공격 대상을 선택한 후 해야할 일은 웜을 통해 원격 시스템에 접근 권한을 가질수 있도록하는 취약점을 선택하는 것이다. 대상 호스트위에서 임의의 명령어를 수행할 수 있어야한다. 추가적으로 외부에서 범용적으로 접근이 가능한 원격 서비스 인지 확인할 필요가 있다.
사내에서만 사용하는 email 서비스와 같은 로컬 서비스는 인터넷을 통해 거의 접속할 수 없다. 그래서 그러한 서비스들의 취약점은 별로 유용하지 않다고 생각할 수 있으나 신뢰할수 없는 인터넷과의 연결을 고려하여 설계되지 않았으므로 의외의  취약점을 가지고 있다.  일반적으로 알려져서 패치를 가지고 있는 것 보다 새롭고 알려지지 않은 익스프로잇이 더 공격하기 좋다고 생각할 수 있으나 그동안 역사는 꼭 그럴 필요까지는 없음을 보여준다. Code Red와 Nimda는 공표된 패치를 가진 취약점이지만 아직까지 인터넷에서 문제를 일으키고 있다. 
마지막으로, 다중 공격 벡터 의 사용이다. Ramen 웜 또는 Nimda 처럼 이것은 웜의 전파와 생존력을 강화시킨다. 공격 방법을 취합은 쉽게 대상 시스템을 위해 모아질수 있다.
Slapper에 의해 사용된 취약점은 OpenSSL 라이브러리이다. 여러 애플리케이션들은 SSL 프로토콜을 활성화시킨다. (암화화 통신을 위해...).  Slapper에서 사용한 OpenSSL 툴킷의 취약점은 SSL2 프로토콜의 키 교환 프로시져에 있다. 이는 취약점이 문제를 해결하도록 업그레이된 소프트웨어가 아니라면 취약점이 해결되지 않음을 의미한다. 더욱이 키 교환이 안전하게 프락시하는것이 암호화를 사용한 덕택에(?) 거의 불가능해졌기때문에 취약점은 프락시 또는 컨텐츠 필터를 통해 필터하는것이 불가능했다.
Slapper 웜은 SSL-enabled 서비스를 선택! 특성 애플리케이션이 아니라 SSL 프로토콜 자체 문제이다. 웹서버들은 SSL을 일번적으로 사용한다. 그리고 웹서버는 많이 퍼져있으므로 좋은 공격대상이 된다.

5.2 Choice of Language
웜에서의 언어는 중요한 고려사항이다. 왜냐하면 무슨 호스트가 웜을 실행시킨지에 대한 결정을 할 수 있기 때문이다. 만약 언어가 대상 호스트위에서 컴파일되는것을 요구한다면 웜의 대상들에서 얻을수 있는 컴파일러가 요구사항에 추가된다.
네트워크 소켓과 임의의 명령어실행을 보장하는 언어를 고려해야한다. 외부툴의 필요성을 최소화해야한다.

5.2.1 Interpreted versus compiled languages
인터프리터언어는 비슷한 호스트들 타입에서 돌아가는 장접을 가지고 있다. 예를 들어 Perl은 거의 대부분의 UNIT에서 실행되며 많은 윈도우 호스트에서도 가능하다. 또한 네트워크 소켓을 포함하여 컴파일된 코드가 실행할 수 있는 어떤것을 수행할 능력을 가지고 있다. 
이들의 단점은 여러가지가 있다. 첫째, 퍼포먼스 오버헤드와  범위성 문제이다. 동시에 여러 프로세서에 의해 병렬로 처리되는 웜인 경우에 퍼포먼스 오버헤드는 중요할 수 있다. 둘째, 코드가 드러난다. 쉽게 취약점을 이해하고 방어할 수 있다. 셋째, 정적으로 컴파일된 웜들은 사이즈가 이슈이다. 이러한 실행들은 동적 링크된 것들보다 몇배는 크다. 동적으로 링크된 형태가 좀더 작고 효율적이다. 마지막으로 웜은 인터프리터에 종속적으로 만들어진다. 널리 퍼지기는 것이 제한적이다. (Unix에서의 본쉘 또는 윈도우에서 VBScript)

컴파일된 언어는 이에 비해 빠르게 실행되면 그들이 빌드된 대상 플랫폼 어디에서나 실행된다. 외부 종속성이 존재하지 않다. 정적으로 라이브러리를 가지고 컴파일된 웜은 리버스 엔진니어 다르구 어렵게 만들수 있다. (특히 디버깅 심볼을 제거했을때). 이는 웜을 조사하는것을 방해한다. 순가적으로 웜을 퍼지게 할 수 있다. 추가적으로 컴파일된 코드를 가지고 조사자들은 분석하기 위하여 디컴파일하므로 작업을 느리게 하는 요인이 될 수 있다.

 Slapper 웜은 C언어로 쓰여지고 각 호스트에서 컴파일 됐다. 이는 여러 이유를 가지고 있다. 첫째, 웜의 속도는 네이티브 코드를 사용하여 인터프리터와 반대로 크게 향상되었다. 둘째, 컴파일된 애플리케이션 사용을 통해 웜의 익스플로잇의 저장들은 , 호스트 시스템에 접근하기위해 구현 오류를 이용하는 키 교환 프로세스룰 변경할 수 있었다. 마지막으로 각 호스트마다 웜을 컴파일 하는 것으로 호스트에서 호스트로 전달되는것이 라이브러리에 독립적이 될 수 있었다. 그래서 종속석은 컴파일 타임에 만족되었다. 만족되지 못한 종속성은 웜을 컴파일되고 런칭되는것을 막는다.

5.3 스캐닝 기술
웜에 의해 사용되는 조사방법은 생존에 중요한 부분이다. SQL snake 웜을 가지고 보여준것 처럼 스캔하기 위한 미리 정해진 주소 목록은 쉽게 예상이 빗나가고 웜의 확산을 막는다. 이 기술은 우선 웜이 밀집한 네트워크에 머물도록 돕고 적은 호스트가 있는곳에 스캐닝과 공격에 소비되는 시간을 최소화하도록 잘 디자인된것으로 나타난다.

Nimda와 Code Red II에서 채택한 island hopping 기술은 랜덤또는 직접 스캐닝하도록 효과적인 균형이루고 있다. 웜은 호스트가 많은 환경에 머무는것 같고 비슷한 보안정책을 가지고 있는것 같다. 이 의미는 웜은 같은 네트워크안에서 다른 취약한 호스트를 찾을 높은 가능성을 가지고 있다.

Slapper 웜은 8개의 의사난수를 이용하여 조사하고 공격하기 위한 호스트 리스트를 생성했다. 웜에 의해 생성된 이 리스트는 네트워크 주소의 첫 8자리를 포함한다. 

이 리스트는 랜덤하게 선택되고 조사와 공격을 위해 random/16 을 생성한다.
조사를 위해 65,000 주소 이상 리스트를 생성했다면 Slapper는 아파치 서버를 위한 스캐닝을 시작한다. 
웜에 의해 수행되는 핑거프린팅는 GET 요청을 사용한다.
웜은 서버에 연결한다. 그리고 간단한 요청을 보낸다. 서버에의해 보내진 응답은 서버를 핑거프린트에 필요한 정보를 포함하고 있다.
HTTP/1.1 400 Bad Request
Date: Mon, 23 Sep 2002 13:13:07 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux

"Server" 헤더에서 Apache 가 있는지 문자열을 비교하여 있다면 아키텍쳐가 무엇인지 확인한다. 이를 통해 성공적인 익스플로잇을 위한 적절한 파라미터를 가지고 런치한다.


5.4 Payload delivery mechanism
또다른 고려사항은 부모 노드로 부터 자식 노드까지 웜 페이로드의 운송이다. 웹사이트나 파일 분산 센터와 같은 중앙 위치로 부터 웜을 분산하는것에대한 생각은 논리적이다. 그러나 그러한 중앙집중적인 방법은 쉽게 다운될 것이다.또는 체크되지 않은채로 남아 있다면 웜의 노드들의 기하급수적인 리스트가 커지므로써 혼잡한 상태로 될것이다.
대신 부모로부터 자식까지 웜 페이로드의 분산은 웜에게 노드의 리스트를 줄이게하는 가장 효과적인 방법처럼 보인다. 자식 노드에 대한 제어를 얻는것으로써 부모는 자식 노드 시스템안으로 웜 페이로드를 인젝션할 수 있거나 부모의 서버 프로세스로 부터 해당 아카이브를 바로 다운로드하게 할 수 있다.
웜의 페이로드는 좀더 효율적으로 수행되기 위하여 다소 작아야만한다. 웜의 사이즈가 증가되는 것으로 트래픽이  증가될수 있으므로 쉽게 혼잡 상태가 될수 있다. 더 작게 되기 위하여 웜의 페이로드를 최적화함으로써 웜 네트워크는 사용할 수 없을 정도의 혼잡이 일어나기 전에 더 많이 뿌려질수 있다.

자식으로 부터 부모느도로 요청을 사용하기 보다 Slapper 웜은 직접 인젝션 매커니즘을 사용했다. 성공적으로 대상 호스트를 꽤어냈으면 제어 채널은 열리고 소켓 데이터들을 로컬 파일에 저장한다.

소스코드는 부모로부터 자식노드까지 열린 소켓에 쓰여진다. 쉘 명령어는 웜소스를 컴파일하기 위하여 자식노드위에서 수행한다. 인수로 부모노드의 IP주소를 가지고 실행된다.


5.5 Installation on the target host
웜의 제어아래 있는 자식노드를 가지고 시스템 모니터로부터 웜프로세스를 숨기는 작업이 필요하다. 존재를 숨기기 위한 여러 기술이 있다. (커널 모드 설치, 루트킷, 시스템 바이너리 변경, 프로세스 재명명). 주요 매커니즘중에 하나는 시스템 부팅시 소프트웨어를 설치하는것이 있다. 유닉스 호스트에서 시스템 초기 스크립트에서 웜 소스 코드를 호출하는것으로 수행할 수 있다. 윈도우 호스트에서 부트타임에 시작하는 실행이나 시스템 레지스트리를 변경하는것으로 수행 할 수 있다.
Slapper 웜은 요구 권한이 부족하기 때문에 이러한 처리를 하지 않는다. 프로세스와 파일을 시스템으로부터 숨기지 않고 웜은 감염 시간에만 런치된다. (시스템이 리붓 되면 깨끗해진다.) 이러한 제한은 웜에서 얻을수 있는 권한 때문이다. 

5.6 Establishing the worm network
대상을 식별하고 성공적으로 꾀어낸 후 자식 웜 노드는 웜 네트워크에 추가될 수 있다. 이 것은 새로운 호스트에 웜 소프트웨어를 설치하고 실행하는것보다 좀 더 관련되어 있다. 대신 웜 노드가 나머지 웜 노드들에게 위치를 알린다. 이것은 전자 우편 매세지 (Linux Ramen worm), 패킷 (Morris worm) 또는 통신채널에 표식(Leaves worm) 을 통해 수행될 수 있다. 
Slapper 웜은 통신 채널로 2002/UPD 포트를 사용한다. 

5.7 Additional considerations
p2p 네트워크의 익스플로잇은 유통을 위한 잘 사용되지 않던 통로이다. p2p 컴퓨터들은 이미 클라이언트 서버들처럼 행동하고 있다. 이를 이용하면 쉽게 전파 시킬수 있다. 


5.9 Alternative designs

나머지 생략..~~
 
Slapper 웜 분석 문서