Tag Archives: 리눅스

[리눅스 프로그래밍] 간단한 나만의 쉘(Shell) 만들기

작년에 리눅스 프로그래밍 과제로 만들었던던 간단한 쉘 입니다. 이름은 어찌 지어야 할지 몰라서 minish이라고 하였습니다. 몇가지의 간단한 기본 명령어를 구현하였으며 백그라운드 프로세스 실행 및 >, >>등의 리다이렉션과 파이프(|)를 구현 하였습니다. 환경 변수를 활용한 프롬프트의 모양 변경도 가능합니다. 최대한 심플하게 그리고 예외처리 없이(시간이 부족했었다곤…..ㅠㅠ) 제작 되었습니다.

사용자 삽입 이미지쉘의 기본적인 화면입니다. 심플 그 자체입니다.

사용자 삽입 이미지파일 복사 명령어인 cp명령어의 테스트 화면입니다.

사용자 삽입 이미지파일 삭제명령어인 rm의 실행 모습입니다.

사용자 삽입 이미지파일 이동 명령어인 mv입니다. 위에서는 파일 이름을 변경하는데 사용해보고 있습니다.

사용자 삽입 이미지디렉토리를 옮겨다니는 cd 명령어의 수행 모습입니다. 권한이 있다면 디렉토리를 이동해 다닐 수 있습니다.

사용자 삽입 이미지디렉토리 생성 명령어인 mkdir입니다. 디렉토리를 생성하고 들어가보는 것까지 해보았습니다.

사용자 삽입 이미지디렉토리 삭제 명령어인 rmdir의 실행 모습니다.

사용자 삽입 이미지리눅스에 기본적으로 있는 cat명령어이죠. 욕심을 가지고 만들다가 파일 리더 그이상의 기능을 구현하지 못하였습니다;; 원래는 표준입력을 받아서 파일을 생성할수 있어야 하는데 말이죠..ㅠㅠ

사용자 삽입 이미지쉘의 종료 명령어입니다.

사용자 삽입 이미지환경 명령어를 설정하는 모습니다. PS2에 일반적으로 쓰이는 형태의 프롬프트 모양을 입력해 두시면 그 쉘 모양대로 프롬프트가 뜨게 됩니다.

사용자 삽입 이미지파이프(|)를 사용하는 모습입니다. 이거 생각보다 구현하기가 까다롭습니다…ㅠㅠ

사용자 삽입 이미지리다이렉트의 생성&추가를 해보는 모습입니다. 표준입출력의 기본이죠.

사용자 삽입 이미지백그라운드 프로세스(&)를 실행하는 모습입니다. sleep명령어를 수행하면 그 시간만큼 쉘이 멈춰있게 되는데 바로 다른 명령어를 입력받는것을 볼 수 있습니다. 이거 구현을 조금 야매로 한 감이 있긴 한데 정상 동작을 하는 듯하면서도 아닌듯 하면서도;; 아하하…아무튼 그렇습니다.

만들었던 소스를 공개 합니다. 잘만들지는 않았지만 학습용으로는 좋을것이라 생각됩니다. 하지만 과제 제출용으로 쓰실려는 학생 여러분…처음부터 끝까지 혼자 능력으로 프로그래밍 잘 하는 사람은 없다고 봅니다. 하지만 이 자료를 받아서 노력하는데 보탬이 되는데 쓸 지언정…그대로 내진 마세요…예전에도 어떤 학생이 교수님한테 이 블로그를 걸렸다고 글을 내려달라는 요청을 받은적도 있는데;;ㅎㅎ 스스로 공부합시다.

참고로 안에 Makefile도 있으니 make로 돌려 컴파일 하여 사용하시면 됩니다.

1066519629.zip

ProxyAJP를 이용한 Apache2 + Tomcat 연동시 중대한 보안 문제

– 2010.08.03 추가
아래에 쓴글은 정상적으로 작동하지 않으며 다음의 방법이 보안을 위한 정상적인 방법입니다.


ProxtRequests 설정을 Off로 변경 :
외부 요청이 차단됨, 이후에도 ProxyPass, ProxtPassMatch등 정상 사용 가능


– 기존의 글

기존에 다음과 같은 ProxyAJP를 이용한 Apache2와 Tomcat의 연동법에 대한 글을 썼었습니다.

Proxy AJP + mod_rewrite를 이용하여 Apache 2.2 + Tomcat 완벽 연동하기
Apache 2 Proxy AJP를 이용한 호스팅 환경에서의 완벽 연동

하지만 위의 방법들에 중대한 보안 문제가 있다는 것을 알게 되었습니다. 어느 순간부터인가 서버에 엄청난 트래픽이 유입되더군요.

저는 단순히 DDOS공격인줄 알았습니다. IP는 정체를 알수 없이 전세계에서 들어오더군요. 사실상 끝나기를 기다리며 내 서버에는 사실상 영리목적의 사이트가 없는데 무엇이 목적일까 고민하게 되었습니다.

우선 쌓이는 로그가 매우 특이한것을 알수 있었습니다. 로그는 대충 다음과 같은 형식이었습니다.

[code]202.109.175.224 – – [17/Apr/2009:21:17:39 +0900] “GET http://www.dfwater.com/Index.asp HTTP/1.1” 503 28 “http://www.dfwater.com/” “Mozilla/4.0 (compatible; MSIE 6.0; Windows 5.1)”
84.16.227.121 – – [17/Apr/2009:21:17:35 +0900] “GET http://www.google.com/ie?q=puts+inurl:?p%3D&hl=en&num=100&start=200&sa=N HTTP/1.0” 302 335 “http://www.google.com/ie?q=puts+inurl:?p%3D&hl=en&num=100&start=200&sa=N” “Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)”
64.91.72.166 – – [17/Apr/2009:21:17:39 +0900] “CONNECT 205.188.251.26:443 HTTP/1.0” 200 – “-” “-“
61.160.211.12 – – [17/Apr/2009:21:17:36 +0900] “GET http://www.kiss888mu.cn HTTP/1.1” 500 3847 “http://www.baidu.com” “Mozilla/4.0 (compatible; MSIE 6.0; Windows 5.1)”
118.69.166.3 – – [17/Apr/2009:21:17:39 +0900] “GET http://69.147.112.211/config/isp_verify_user?l=mmg&p=0011 HTTP/1.0” 200 26 “-” “-“
208.70.78.177 – – [17/Apr/2009:21:17:36 +0900] “GET http://www.google.com/ie?as_q=inurl:/guestbook.html+tampa+fl+gay+life+and+dating&num=100&hl=en HTTP/1.0” 302 355 “http://www.google.com/ie?as_q=inurl:/guestbook.html+tampa+fl+gay+life+and+dating&num=100&hl=en” “Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8b2) Gecko/20050224 Firefox/1.0+”
78.30.203.105 – – [17/Apr/2009:21:17:39 +0900] “GET http://inmarket73.ru/forum/index.php?s=fb2bade970f814c6d66c67f414a2328b&act=Reg&CODE=image&rc=35f728107e6ae6292a22c4e6f16634ac&p=3 HTTP/1.0” 200 68 “http://inmarket73.ru/forum/index.php?act=Reg&CODE=image&rc=7f430230e31d334872d1b5136a57b9ce&p=1” “Mozilla/4.0 (compatible; MSIE 6.0; AOL 9.0; Windows NT 5.1)”
94.76.199.2 – – [17/Apr/2009:21:17:36 +0900] “GET http://superschurke.de/comments/feed/ HTTP/1.1” 404 809 “-” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)”[/code]

로그가 좀 지저분 합니다만 형식이 다음과 같다는것만 보시면 됩니다. 요청이 GET 메서드 이후에 http로 시작하는 것을 알수 있습니다. 그것도 전혀 쌩뚱 맞은 도메인과 호스트에 요청을 합니다.

이것이 왜 이상하냐면 보통의 브라우저는 요청을 할때 다음과 같이 합니다. theeye.pe.kr/index.html의 요청이 있다면 DNS에 질의 하여 theeye.pe.kr 도메인의 호스트 IP를 알아낸 이후에 그곳에 접속하여 GET /index.html 과 같은 방법으로 요청을 하게 됩니다.

위와 같은 방법은 마치 여의도에 가서 “롯데월드가 어딧나요?” 라고 물어보는 꼴이 되는 것입니다.

왜 저런 요청이 자꾸 들어오는 것인지 궁금하여 서버에 다음과 같이 테스트를 해보았습니다.

[code]telnet theeye.pe.kr 80
GET http://www.naver.com[/code]
자, 상식적으로 잘못된 요청이라고 나와야 하지만 정상적으로 페이지가 출력됩니다. 아니 왜 내 서버에서 엉뚱한 사이트의 요청을 처리해 주는 것이지!?

이제 여의도에 가서 “롯데월드가 어딧나요?” 라고 물었더니 상대방이 자기 차에 태워 롯데월드에 데려다 주었습니다.

친절한 사람이군요;;; 근데 문제가, 이걸 악용해서 소문이 나서 세상의 모든 사람이 이 친절한 사람에게 와서 자신이 가고싶은 곳이 어딧는지를 물어본다는 것이 문제가 됩니다.

서버가 엉뚱한 요청을 받아 대리 요청후에 결과를 되돌려 주는 문제는 일전의 Proxy설정의 잘못이었습니다.

ProxyAJP설정을 별다른 보안 절차 없이 설정하게 되면 이 세상 모든 http 요청의 IP세탁 시스템으로 둔갑되어질 수 있습니다.

이문제를 해결하기 위해서는 간단하게 Proxy 요청은 로컬호스트에서만 가능하게 설정하시면 됩니다.

[code]<Proxy *>
Order Deny,Allow
Deny from all
Allow from localhost
</Proxy>[/code]
간단하게 해결되었죠? Proxy 설정을 하시고 서버를 운영하시는 분들은 다른 호스트로의 요청을 해보시기 바랍니다.

에러없이 요청이 정상처리 된다면, 이제 표적이 되기전에 설정을 조금 손보시기 바랍니다.

첨언 : 추가로 로그들을 쭉 분석해 봤는데, 위와 같은 방법을 사용하는 이유는 특정 사이트의 검색요청을 계속하여 검색랭킹을 올린다거나, 추천사이트의 어뷰징 혹은 사이트 페이지뷰를 높이는데 사용되어지는 듯 싶습니다.