CentOS 에서 openssl 설치 관련 질문입니다.

happyrjsgh3의 이미지

안녕하세요

HEART BEAT 취약점 구현을 하기 위해서

apache + php + openssl (취약한 버전) 으로 서버를 만들고

패킷생성기로 HEART BEAT 패킷을 생성하여 서버로 보내면 그때의 패킷을 캡쳐하여

snort 룰을 적용하여 탐지하는 시나리오로 구현하려고 합니다.

그런데 문제는 제가 사용하고 있는 CentOS6.5 에서는 기본적으로 패치된 openssl이 설치되어 있어서

취약한 버전으로 다운그레이드를 해야 하는데요, 이를 위해서 얼마전에 질문을 올렸으나 해결을 못하였습니다.

apache 와 연동하여 쓰려면 취약한 버전의 openssl 소스를 컴파일 해서 써야하는지 아니면 rpm 을 써서 해야하는지...

openssl 을 다운그레이드 하고 싶어서 취약한 버전의 openssl.rpm 을 다운받은 후 rpm -Uhv --force openssl-version.rpm

명령어를 써서 다운그레이드 하려고 하였으나 의존성 문제 때문에 오류가 생겨 다운그레이드가 되지 않았습니다. 그래서 낮은 버전의

openssl 소스파일을 컴파일 하여 설치하였으나, 이게 제대로 설치가 되어서 연동이 되는건지도 잘모르겠습니다.

그래도 일단 해보자고 생각해서 apache 를 설치하고 환경설정을 하다가 자리를 이동해야 해서 centos 를 종료하였는데, 다시 켜려고

하니 진행 bar 가 마지막에 회색으로 변하면서 켜지지도 않더군요.. 그래서 오늘은 낮부터 지금까지 윈도우로 openssl 을 컴파일 하고

apache 와 연동을 하려고 하였으나 apache 를 컴파일 하는 과정이 쉽지만은 않네요...

그래서 centos를 다시 설치하고 처음부터 다 다시 시작하려고 합니다. 제가 아직 배우는 단계의 학생이라 지식이 많이 부족하여 질문조

차 제대로 하고 있는건지 잘 모르겠네요.

어느 누군게에는 간단한 환경설정일지 모르겠으나 저는 지금 이걸 해결도 못하고 딱히 주변에 물어볼 사람도 없어

이글을 읽고 계시는 분들께 제가 처한 문제에 관해 조언 한마디씩 부탁드립니다...징징거리는 글 읽어주셔서 감사합니다.

(아무래도 프로그래머로 직장을 구하고 먹고 살려면 스트레스 관리 능력이 좋아야 할거같네요. )

김정균의 이미지

일단 너무 어렵게 진행하시는 것 같아.. 다른 방법을 알려드리겠습니다.

일단, 컴파일은 생각하지 마시고, 현재 시스템에 설치되어 있는 것을 그대로 활용하도록 하세요.

1. 취약점이 있는 openssl rpm version을 특정 위치에 풀어 놓습니다.

   mkdir /opt/openssl-heartbeat
   cd /opt/openssl-hearbeat
   rpm2cpio openssl-version.rpm | cpio -idmv

이렇게 하신 후에, apache를 시작하는 script나 shell에서 다음의 환경 변수를 export 합니다.

   export LD_LIBRARY_PATH="/opt/openssl-heartbeat/usr/lib64:/opt/openssl-heartbeat/usr/lib:${LD_LIBRARY_PATH}"
   /etc/init.d/httpd restart

이렇게 하시면 /usr/lib(32bit) 또는 /usr/lib64(64bit) 에 있는 openssl이 아니라 /opt/openssl-heartbeat 에 있는 openssl을 link해서 구동이 되게 됩니다. 즉 컴파일을 다시 할 필요가 없다는 얘기이죠. 실제로 이렇게 구동이 되었는지는 lsof 명령을 이용해서 확인이 가능 합니다.

그리고, openssl 은 해당 배포본 버전의 것을 이용해야 합니다. 즉, centos 6에서 centos 7이나 centos 5의 openssl을 사용하면 library 의존성 문제 때문에 실행 자체가 안될 수 있습니다.

happyrjsgh3의 이미지

답변 감사합니다!!

rpm -Uhv --force --nodeps openssl-version.rpm 명령어를 사용해서 억지로 설치하긴 했는데

그냥 centos 새로 설치하고 하는 알려주신 방법으로 하는게 더 좋을것 같네요!!

김정균의 이미지

아 깜빡 한 것이 있는데, 아마 apache init scritp에서 환경 변수를 reset 할 수 있습니다. 이럴 경우에는 init script를 사용하지 말고 직접 실행하셔야 할 수도 있습니다.

happyrjsgh3의 이미지

답변 감사합니다 :-)

happyrjsgh3의 이미지

안녕하세요 알려주신 방법으로 해봤는데 잘 안되는것같아서
염치 불고하고 또 질문 드립니다
export 하고.
lsof 명령어를 써서 확인해봤는데 opt/openssl 에 관한 내용은 없는거 같아
댓글로 달아주신 방법인 직접실행? 을 해봐야 할거 같은데
직접 실행이 구체적으로 무엇을 의미하는것인지 이해가 잘안됩니다.

아래 그림파일은 스크린 샷입니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon 1.jpg221.87 KB
Image icon 2.jpg26.92 KB
Image icon 3.jpg26.92 KB
김정균의 이미지

일단 image 상을 apache가 rpm은 아닌 듯 싶군요 :-)

shell에서

export LD_LIBRARY_PATH="/opt/openssl-heartbeat/usr/lib64:${LD_LIBRARY_PATH}"
ldd /usr/local/httpd-2.4.3/SOME-PATH/mod_ssl.so

하셔서 libssl.so 가 /opt/openssl-heartbeat 를 링크하는지 확인해 보세요. 일단 이것이 확인이 된다면, init script에서 httpd 실행 명령을 찾아서, 현재 쉘에서 직접 실행해 보신 후에, lsof | grep httpd | grep ssl 명령으로 /opt/openssl-hearbeat 을 링크하고 있는지 확인하시면 됩니다. (64bit 가정으로 설명 드린 겁니다. 32bit라면 lib64가 아니라 lib로 하시면 됩니다.) 설마 64bit 32bit 패키지를 혼용하고 계신건 아니겠죠?

일단, 환경 자체가 제가 말씀드린 환경과 다른 것으로 보이기 때문에, 왜 안되는지에 대해서는 체크할 방법이 없네요 :-) 불편하겠지만 LD_LIBRARY_PATH를 export 한 쉘에서 httpd binary를 직접 실행하시면 될 겁니다.

혹시 안되서 다시 질문을 하실 때에는 mod_ssl.so 경로와 apache binary의 32/64bit 정보, lsof | grep httpd | grep ssl 결과, LD_LIBRARY_PATH가 export된 쉘에서 ldd mod_ssl.so 의 정보를 같이 주세요.

happyrjsgh3의 이미지

apache 는 httpd2.4.12.tar.gz 를 컴파일해서 설치했습니다.
그리고 제가 혹시 openssl rpm 을 잘못다운 받은것일까요?
openssl-version.rpm 안에는 libssl.so 파일이 없어서 안되는 걸까요?
매번 답변해주셔서 감사합니다.
맘같아선 찾아뵙고 뭐라도 대접하면서 질문드리고 싶네요ㅠㅠ
첨부파일을 확인해주세요.
감사합니다

댓글 첨부 파일: 
첨부파일 크기
Image icon 1.jpg227.55 KB
Image icon 2.jpg218.12 KB
Image icon 3.jpg24 KB
김정균의 이미지

openssl.so 는 빌드할 때 link 시에 필요한 것이고, 실행시에는 libssl.so.버전 파일을 찾습니다.

일단, centos 6 을 설치하신 것이 맞나요? /opt 에 풀어놓은 openssl이 centos 6용이 맞나요? 일단 파일 이름을 봐서는 centos 6용이 아닌 것 같습니다만..

/opt/openssl-heartbeat/usr/lib64/libssl.so.1.0.1e
/opt/openssl-heartbeat/usr/lib64/libssl.so.10

파일이 존재 하는지요? 일단 ldd 결과로 보면 openssl rpm package가 의심스럽네요 :-)

예를 한번 들어 보겠습니다. (일단 제 시스템에서의 예이고, Centos 6 최신버전 기준입니다.)

[root@main shm]$ ldd /usr/lib64/libssl.so.10
        linux-vdso.so.1 =>  (0x00007fff19cdf000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f94e1229000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f94e0f42000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f94e0d3e000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f94e0b12000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f94e072e000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f94e052a000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f94e0314000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f94dff7f000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f94dfd74000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f94dfb71000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f94df956000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f94df739000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f94e16df000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f94df519000)
 
일단 아무것도 하지않은 상태의 libssl.so 가 link 하고 있는 library 입니다.
 
[root@main shm]$ export LD_LIBRARY_PATH="/dev/shm"
[root@main shm]$ echo $LD_LIBRARY_PATH
/dev/shm
 
이 shell의 LD_LIBRARY_PATH에 /dev/shm 을 추가했습니다.
 
[root@main shm]$ cp -af /lib64/libkrb5.so.3 /dev/shm
 
/dev/shm 에 libkrb5.so.3 을 복사 했습니다.
 
[root@main shm]$ ldd /usr/lib64/libssl.so.10
        linux-vdso.so.1 =>  (0x00007fff19cdf000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f94e1229000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f94e0f42000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f94e0d3e000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f94e0b12000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f94e072e000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f94e052a000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f94e0314000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f94dff7f000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f94dfd74000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f94dfb71000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f94df956000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f94df739000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f94e16df000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f94df519000)
 
어 libkrb5.so.3이 /dev/shm에 있는 것이 아니라 /lib64 에 있는 것을 link하고 있습니다. /dev/shm/libkrb5.so.3 이 link 되었을 거라고 예상했는데, 변경 사항이 없네요.
 
 
[root@main shm]$ l
합계 0
lrwxrwxrwx 1 root root 14 2015-04-10 04:42 libkrb5.so.3 -> libkrb5.so.3.3
 
/dev/shm/libkrb5.so.3을 확인해 봅니다. 아 libkrb5.so.3은 libkrb5.so.3.3의 soft link이네요. 그리고 link위치에 libkrb5.so.3.3이 없네요. libkrb5.so.3.3을 /dev/shm/에 복사를 합니다.
 
[root@main shm]$ cp -af /lib64/libkrb5.so.3.3 /dev/shm
[root@main shm]$ l
합계 920
lrwxrwxrwx 1 root root     14 2015-04-10 04:42 libkrb5.so.3 -> libkrb5.so.3.3
-rwxr-xr-x 1 root root 941920 2015-04-09 14:27 libkrb5.so.3.3
 
이제 잘 들어와 있군요.
 
[root@main shm]$ !ldd
ldd /usr/lib64/libssl.so.10
        linux-vdso.so.1 =>  (0x00007fff9efff000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f8934d79000)
        libkrb5.so.3 => /dev/shm/libkrb5.so.3 (0x00007f8934a92000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f893488e000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f8934662000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f893427e000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f893407a000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f8933e64000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f8933acf000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f89338c4000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f89336c1000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f89334a6000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8933289000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f893522f000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f8933069000)
 
이제 libkrb5.so.3 이 /dev/shm/에 있는 것을 link하고 있네요.

위의 설명을 보시면 이해를 하실 수 있을 겁니다. LD_LIBRARY_PATH는 기존의 library link를 다른 위치의 파일로 변경을 해 줄 수 있는 것입니다. 다만, library file 이름과 library soname이 동일해야 linking이 제대로 동작을 한다는 점입니다.

그렇기 때문에 Library 경로를 hooking 하기 위해서는 hooking할 library가 기존에 link된 것과 동일한 환경에서 빌드된 것이어야 한다는 것입니다. 그러므로 CentOS 6 64bit를 설치 하셨다면, CentOS 6의 64bit openssl의 다른 버전을 찾아서 위와 같아 하시면 되는 것입니다.

happyrjsgh3의 이미지

해결하였습니다.
openssl rpm 을 잘못다운받은게 원인이였네요....
답변 정말 감사해서 그런데 혹시 메일이라도 남겨주시면 기프티콘이라도 보내드리고 싶습니다.
항상행복하시길 바랄게요^^

김정균의 이미지

마음만 감사하게 받겠습니다. :-)

black123의 이미지

저도 꽤 애먹고 있습니다 ㅜㅜ 혹시 어떤 버전을 설치하셨는지 여쭈어봐도 될까요

김정균의 이미지

hearbleed bug가 있는 버전을 말씀 하시는 거가요? CentOS 6.5의 openssl-1.0.1e-16.el6_5.7 이 fix 된 버전 입니다. 그러므로 이 이전 버전을 받으시면 됩니다. centos 6이라면

x86 용:
http://vault.centos.org/6.5/updates/x86_64/Packages/openssl-1.0.1e-16.el6_5.4.i686.rpm

x86_64 용:
http://vault.centos.org/6.5/updates/x86_64/Packages/openssl-1.0.1e-16.el6_5.4.x86_64.rpm

정도를 사용하시면 될 겁니다.

pchero의 이미지

이미 해결되서 다행이지만, 다음번에 같은 작업을 해야 한다면.... 이런거 한번 써보시면 좋을 것 같습니다. :)

https://github.com/arthurnn/heartbleed-docker

---------------------------------
제일 왼쪽이 저입니다 :)

happyrjsgh3의 이미지

뭔지 궁금해서 써봤는데 뭔지 잘모르겠네요;;
그냥 Monitoring 하는건지 아니면 heart bleed 공격 하는건가요??
localhost:9099 에 아무것도 안떠서요 ㅎㅎ

pchero의 이미지

도커라고 하는 컨테이너 패키지 입니다.

가상 머신과 비슷한 개념인데, 가상 머신에 비해 굉장히 작은 크기가 특징입니다.
올려드린 링크는 heartbleed 를 설정해놓은 도커 패키지입니다.

무언가를 테스트하기 위해서는 happy 님이 하셨던 작업과 같이 처음부터 시스템을 구성하는 것이 보통입니다.
하지만 만약 누군가가 필요한 시스템을 가상머신 패키지로 만들어 놓고 공유해놓았다면, 이런 수고 없이 그냥 그 패키지만 다운 받아서 가상 머신으로 돌리면 돼겠지요.

도커는 이런 가상머신 패키지에서 꼭 필요한 내용들만 뽑아서 만든 시스템입니다.
가상 머신에 비해 크기가 엄청나게 줄어들지요.

아래에 도커와 관련된 내용들을 링크 걸어놨습니다.
한번 읽어보시고 써보시면 신세계를 만나실 겁니다. ㅎㅎㅎㅎ

도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
http://www.slideshare.net/pyrasis/docker-fordummies-44424016

도커(Docker)에 관련된 한글 문서를 정리한 메타 문서
https://github.com/remotty/documents.docker.co.kr

---------------------------------
제일 왼쪽이 저입니다 :)

happyrjsgh3의 이미지

링크 정독해야겠군요 ㅎㅎㅎ
신기한게 정말 많은거같아요
감사합니다^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.