'ip_forward'에 해당되는 글 4건

  1. 2011.04.25 SSL 인증서 릴레이 네트워크 중계 sslsniff
  2. 2009.09.24 CentOS에서 ipvsadm으로 Virtual Server 구축
  3. 2009.06.08 iptables를 이용한 NAT(Network Address Translation) 구현 (1)
2011.04.25 18:37

SSL 인증서 릴레이 네트워크 중계 sslsniff

Some History:

This tool was originally written to demonstrate and exploit IE's vulnerability to a specific "basicConstraints" man-in-the-middle attack. While Microsoft has since fixed the vulnerability that allowed leaf certificates to act as signing certificates, this tool is still occasionally useful for other purposes.

It is designed to MITM all SSL connections on a LAN and dynamically generates certs for the domains that are being accessed on the fly. The new certificates are constructed in a certificate chain that is signed by any certificate that you provide.

The New Scoop:

Version 0.6 has been significantly updated to additionally support the null-prefix attacks that I demonstrated at BlackHat 09 and Defcon 17. These allow for completely silent MITM attacks against SSL/TLS in the NSS, Microsoft CryptoAPI, and GnuTLS stacks — ultimately allowing for SSL communication in Firefox, Internet Explorer, Chrome, Thunderbird, Outlook, Evolution, Pidgin, AIM, irssi, and every other client that uses the Microsoft CryptoAPI to be intercepted.

sslsniff has also been updated to support the OCSP attacks that I published at Blackhat 09 and Defcon 17, thus making the revocation of null-prefix certificates very difficult. Additionally, sslsniff now supports modes for hijacking auto-updates from Mozilla products, as well as for Firefox/Thunderbird addons. Attackers can specify payloads of their choice, which will be delivered to the targets being man-in-the-middled.

sslsniff is useful for deploying other vulnerabilities as well. This is the tool that the people who pulled the recent MD5 hash collision publicity stunt used to demonstrate MITM attacks with their rogue CA-certificate. Also, anyone who is capable of obtaining a forged certificate by any means can easily deploy it through sslsniff with the targeted mode designed for null-prefix attacks.

For more information on these attacks, see the video from Defcon 17.

The three steps to get this running are:
  • Download and run sslsniff-0.7.tar.gz
  • Setup iptables
  • Run arp-spoof

Installing sslsniff

  • Install the sslsniff dependencies (openssl, libboost1.35-dev, libboost-filesystem1.35-dev, libboost-thread1.35-dev, liblog4cpp5-dev)
  • Unpack sslsniff-0.7.tar.gz, run './configure', run 'make'

sslsniff requires Linux 2.4/2.6, although it can easily be ported to other platforms.

Running sslsniff

  • sslsniff can now be run in the old "authority" mode or the new "targeted" mode. You can specify a single cert to sign new certificates with, or you can specify a directory full of certificates to use for targeted attacks (these can be null-prefix or universal wildcard certificates).
  • sslsniff can now also defeat OCSP, fingerprint clients to attack, and hijack auto-updates.
  • See the README for more information on how to run sslsniff

Setting up iptables

  • Flip your machine into ip_forward mode (echo 1 > /proc/sys/net/ipv4/ip_forward)
  • Add a rule to intercept SSL traffic (iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-ports <$listenPort>)
  • If you wish to fingerprint clients and only intercept some traffic based on client type, add a rule to intercept HTTP traffic (iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-ports <$httpListenPort>)

Running arpspoof

Assuming we want to intercept SSL traffic from 172.17.10.36, we need to trick that host into thinking that we're the router. Using arpspoof, we can convince the target that the router's MAC address is our MAC address.

  • arpspoof -i eth0 -t 172.17.10.36 172.17.8.1

At this point, any SSL traffic should get proxied by sslsniff and logged to the file you specify.



출처 : http://www.thoughtcrime.org/software/sslsniff/

Trackback 0 Comment 0
2009.09.24 13:21

CentOS에서 ipvsadm으로 Virtual Server 구축

기존에 CentOS에서 piranha-gui를 이용해서 Linux Virtual Server를 구축했었는데, 영 감이 안와서... 검색해서 ipvsadm으로 Virtual Server를 구축했다.

다음의 IP로 가상 서버를 구축한다고 가정한다.
Virutal IP : 192.168.1.10
Real IP : 192.168.1.20
Real IP : 192.168.1.21


일단은, 방금 구축한 경험으로 봤을 때 2대의 실 서버를 로드밸런싱하려면 ipvsadm을 동작시킬 서버까지 포함해서 3대가 있어야 될것 같다.(direct routing 방법 사용시)

Virtual Server
일단은 ipvsadm을 설치한다. 나의 경우는 yum을 이용해서 패키지 설치를 했다.
# yum install ipvsadm
# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
#

요렇게 해서 나오면 정상.

이제 가상 IP를 설정한다. 네트워크 디바이스가 eth0으로 할당되어 있다고할 때, eth0:1의 이름으로 가상 디바이스를 생성한다.
# ifconfig eth0:1 192.168.1.10 netmask 255.255.255.0 up
# ifconfig

이렇게 하면 eth0:1의 이름으로 네트워크 디바이스가 생성되어 있을 것이다. 재부팅되었을 때 자동적으로 올라오게 하기 위해서 다음의 파일을 생성한다.
# vi /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.10
NETMASK=255.255.255.0


Virtual Server에서는 가상 IP로 접속되는 연결을 실제 서버로 연결해야 하기 때문에 ip_forward 옵션이 활성화 되어 있어야 한다.
수정할 파일 : /etc/sysctl.conf
net.ipv4.ip_forward=1 로 변경한다.
# sysctl -p
혹은
# sysctl -w net.ipv4.ip_forward=1


이제 ipvsadm에 새로운 서비스를 추가한다.
# ipvsadm -A -t 192.168.1.10:80 -s wlc

옵션에 대한 자세한 사항은 ipvsadm --help 명령으로 확인하기 바란다.
위 옵션은 다음의 의미를 갖는다.
-A : 새로운 서비스 추가
-t : tcp 서비스
-s : scheduling. Weighted Least Connection

이제 서비스를 제공하는 실제 서버에 대한 세팅을 수행한다.
필요한 패키지로는 arptables_jf가 있다. 역시 yum으로 설치한다.
# yum install arptables_jf

arptables_jf 패키지를 설치하는 이유는 다음과 같다고 한다(나도 검색해서 찾았음).
Real Server에도 Virtual IP를 설정해 주어야 하는데, 이렇게 되는 경우 클라인트가 가상 IP를 요청했을 때 동일 네트워크에 Virtual IP를 2개 이상 갖고 있기 때문에 경우에 따라서 Real Server에서 응답을 주는 경우가 있다고 한다. 이렇게 되면 로드밸런싱이 되지 않기 때문에 arptables_jf를 이용해서 응답하지 않도록 해줘야 한다.
arptables_jf 설정을 수행한다.
# arptables -A IN -d <virtual_ip> -j DROP
# arptables -A OUT -d <virtual_ip> -j mangle --mangle-ip-s <real_ip>
# service arptables_jf save
# chkconfig arptables_if on

즉, 192.168.1.20에 해당하는 Real Server를 설정한다면,
# arptables -A IN -d 192.168.1.10 -j DROP
# arptables -A OUT -d 192.168.1.10 -j mangle --mangle-ip-s 192.168.1.20

이 된다.

이제, 네트워크 디바이스를 추가한다.
# ifconfig eth0:1 192.168.1.10 netmask 255.255.255.0

이 설정도 부팅시 자동으로 디바이스가 추가되도록 /etc/sysconfig/network-scripts에 파일을 생성한다.
파일 내용은 이미 기록했기때문에 생략한다.

여기가지 설정이 완료되면, 이제 ipvsadm에 real server를 추가해준다.
Virtual Server에서
# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.20 -g

여기서 -g 옵션은 direct routing으로 추가하겠다는 의미임.

나머지 Real Server도 동일한 작업을 수행한 뒤 마지막으로 ipvsadm 설정을 저장하고, 서비스를 활성화 시켜준다.

# service ipvsadm save
# chkconfig ipvsadm on


이상이다.


출처 : http://www.bongbong.net

Trackback 0 Comment 0
2009.06.08 13:45

iptables를 이용한 NAT(Network Address Translation) 구현

1. NAT란

개요: 컴퓨터에서 인터넷을 사용하려면 IP주소를 부여받아야 한다. 보통 이러한 IP를 공인 IP라 부른다. 그러나 IP주소는 폭발적인 인터넷 사용인구의 증가로 IP가 부족해지는 현상이 나타났다. 이러한 부족현상을 해결하는 방안중의 한 기술이 NAT이다.

정의: NAT란 말 그대로 네트워크의 주소를 변환하여 주는 역할을 하는 것이다. 즉 한개의 공인 IP주소를 가지고 있는데 여러개의 컴퓨터를 사용하려는 경우처럼 한대의 컴퓨터에 공인 IP를 부여하고 나머지는 사설 IP를 부여하여 인터넷사용시에는 공인IP를 공유하여 사용할 수 있도록 해주는 기술이다.


2. NAT의 사용예

여러 대의 피시에서 한 개의 IP를 공유하여 인터넷을 사용하는 경우
=> 공인된 IP가 부여된 컴퓨터에는 랜카드를 두개를 장착하여 하나는 공인IP를 부여하고 다른 하나는 사설IP가 부여된 사설네트워크 연결을 위해 사설IP를 부여하여 인터넷을 공유할 수 있다.

한 개의 IP주소에 여러 대의 서버를 연결하는 경우
=> 부하분산을 위해 한 개의 도메인네임에 대해 여러 대의 서버를 운영하는 경우에도 NAT를 사용한다. 즉, www.linux.ac.kr 도메인 한개에 웹서버, 메일서버, FTP서버를 따로 운영하는 경우 부하평준하 기능도 구현이 가능하다. 예를 들면 웹서버는 192.168.0.1, 메일서버는 192.168.0.2 등 이런 방법으로 구현이 가능하다.

투명프락시
=> 학원에서 인터넷을 강의하는 경우처럼 동일 네트워크에 연결된 여러 대의 PC에서 동시에 같은 사이트를 연결한다. 이 경우 프록시 서버를 이용하면 그 해당사이트를 프록시서버에서 참조해 보다 빠른 접속을 할 수 있다. 이런 프록시 서버를 이용하려면 각 컴퓨터에 설치된 웹브라우저에서 프록시서버를 지정해 주어야 한다. 리눅스에 프록시서버를 설정하면 리눅스를 통과하는 패킷은 자동으로 리눅스에 설치된 프록시서버 프로그램으로 연결된다.


3. iptables에서 NAT의 분류

개요: iptables에서는 크게 두 부류의 NAT로 분류한다. 위 의 경우를 SNAT라 하고 와 의 경우를 DNAT라 분류한다.

종류
1) SNAT: 패킷의 소스 어드레스를 변경한다는 의미이다. 즉 내부 어드레스인 192.168.1.2인 컴퓨터가 다른 웹사이트를 접속하면 203.247.XX.XXX 처럼 공인 IP로 나타나기 때문이다. SNAT는 라우팅 결정 이후에 이루어진다.
패킷의 목적지주소는 이미 정해져 있으므로 라우팅 경로는 결정되어 있고 패킷의 소스 주소가 리눅스를 떠나기 직전에 변경된다.
2) DNAT: 위의 개념과 반대되는 것으로 NAT를 시행하는 리눅스에서 패킷의 목적지 주소를 변경한다. 패킷의 목적지 주소가 먼저 변경되고 그 변경된 주소에 의거하여 새로운 라우팅 경로를 찾는다. 즉 DNAT는 라우팅 이전 단계에서 작용한다.


4. iptables를 이용한 설정

SNAT: 기존의 IP Masquerade를 말한다.

1) 사용법
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3-203.247.50.7
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3:1-1023
=> -o 는 패킷을 보내는 인터페이스 장치를 지정한다. SNAT에서는 패킷을 내보내는 장치를 지정할 수 있다.
 --to 는 나가는 패킷에 부여할 소스 주소이다. IP공유라면 --to 는 인터넷 쪽의 공인 IP를 지정하면 된다.

2) 사용예

ㄱ. 한국통신 ADSL을 리눅스에 연결해 인터넷을 공유하는 경우
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

ㄴ. 고정 IP를 사용하는 리눅스에서 인터넷을 공유하는 경우
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 203.247.50.3
=> 참고로 192.168.0.0/24는 지정하지 않아도 된다.

ㄷ. 유동 IP를 사용하여 인터넷을 공유하는 경우
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

3) 설정의 확인
# iptables -t nat -L

위 설정이외에도 다음과 같은 명령을 내려서 포워딩이 가능하게 해야 한다.
# echo 1 > /proc/sys/net/ipv4/ip_forward

DNAT

1) 개요: DNAT는 부하분산이나 평준화에만 사용하는 것은 아니다. 간단한 방화벽으로도 유용하다.
리눅스A에 DNAT를 설정하여 웹서버와 메일서버를 각각 내부주소인 리눅스B와 리눅스C에서 서비스 하도록 지정하고 인터넷에서 다른 연결은 리눅스A로 지정하면 리눅스A는 간단한 방화벽과 같은 구실을 한다.

2) 사용예

ㄱ. 웹서버 분산
# iptables -A PREROUTING -t nat -p tcp -d 203.247.50.3 --dport 80 -j DNAT --to 192.168.1.11:80
=> 
 -A PREROUTING : DNAT는 먼저 목적지 주소를 변경하고 다음에 라우팅이 이루어진다.
 -t nat : 부하분산도 nat기능이다.
 -p tcp : 웹은 tcp를 사용한다.
 -d 203.247.50.3 --dport 80 : 들어오는 패킷의 목적지 주소가 203.247.50.3이고 포트번호가 www인 경우만 이 규칙을 적용한다.
 -j DNAT : destination NAT
 --to 192.168.1.11:80 : 패킷의 목적지 주소를 192.168.1.11 포트번호를 80번으로 설정하라는 뜻이다. 192.168.1.11 서버에서는 80번 포트에서 웹서버 프로그램을 가동해야 한다.

ㄴ. 메일서버
# iptables -A PREROUTING -t nat -p tcp -d 203.247.50.3 --dport 25 -j DNAT 192.168.1.12:25

ㄷ. DNS서버를 192.168.1.10으로 변경하려면 다음과 같이 지정한다.
# iptables -A PREROUTING -t nat -p udp -d 203.247.50.3 --dport 53 -j DNAT --to 192.168.1.10:53
=> DNS는 UDP를 사용한다.

3) 설정의 확인
# iptables -t nat -L
=> 설정을 보통 포트이름등으로 보여준다.
# iptables -t nat -nL
=> 설정을 포트넘버등 숫자로 보여준다.

4) 설정의 해제
# iptables -t nat -F


5. iptables를 이용한 투명프록시 구현

투명프록시란 투명프록시는 내부 네트워크의 웹브라우저에서 프록시서버를 지정하지 않아도 강제로 프록시서버를
사용하게 하는 설정이다. 프록시를 설정하는 경우의 이점은 캐시를 사용하므로 인터넷 접속 속도를 빠르게 할 수 있다.

iptables에서 설정
1) squid 프록시서버를 작동시킨다.
2) 리눅스 서버의 인터넷쪽에 연결된 랜카드의 인터페이스명이 eth0, 내부랜인 eth1의 주소가 192.168.2.1이라면 다음과 같이 명령을 내린다.
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
=> 
 -t nat : 투명프록시도 패킷의 주소를 변경하는 설정이므로 nat이다.
 -A PREROUTING : 투명프록시는 패킷의 주소를 변경하는 작업이 경로를 찾는 것보다 우선한다.
 -i eth1 : 변경할 패킷이 들어오는 장치를 지정한다. 내부랜이 eth1에 연결되어 있고 이 랜에 연결된 내부 네트워크 시스템들은 이 리눅스를 통해 인터넷을 사용하므로 들어오는 패킷의 장치명은 eth1이다.
 -p tcp : 들어오는 패킷 중 tcp프로토콜만 nat를 적용한다는 뜻이다. www연결은 tcp를 사용한다.
 --dport 80 : 들어오는 패킷의 목적지 포트가 80번인 경우에만 nat를 적용한다는 뜻이다. 따라서 ftp, telnet등은 적용을 안 받는다.
 -j REDIRECT : 투명프록시는 리눅스 내부에서 패킷의 입력포트번호를 변경해 주는 방법이다.
 --to-port 3128 : 들어오는 패킷의 목적지 포트번호를 3128번으로 변경하는 뜻이다. 목적지의 IP주소는 지정하지 않았으므로 모든 인터넷 웹 검색에 대해 투명프록시가 적용된다.
3) 확인
# iptables -t nat -L

다른예
투명프록시가 설치된 리눅스 서버에 웹서버를 설치해도 상관없다. 그런데 192.168.2.x네트워크에서 자신의 웹서버 데이터를 접근할 때도 프록시 서버를 공유한다는 것은 아무런 의미가 없다. 웹서버에서 읽을 때는 홈페이지 디렉토리에서 찾고 프록시에서 찾을 때는 프록시서버의 캐시 디렉토리에서 찾는 차이밖에 없다. 자신의 홈페이지 데이터를 내부랜에서 수시로 변경하는 경우는 오히려 프록시서버 캐시 디렉토리에서 찾으면 문제가 된다. 캐시가 지워지지 않는한 변경된 홈페이지 데이터를 볼 수가 없다. 그래서 내부랜의 윈도우에서 192.168.2.1리눅스 서버의 변경된 홈페이지 데이터를 즉시 확인해야 한다면 http://192.168.2.1 명령시에는 투명프록시가 작용하지 않아야 한다.
1) 그 방법은 아래와 같다.
# iptables -t nat -A PREROUTING -i eth1 -p tcp -d ! 192.168.2.1 --dport 80 -j REDIRECT --to-port 3128
=> 처음의 기본설정에 -d ! 192.168.2.1을 추가하였다. 즉 들어오는 패킷의 목적지주소가 192.168.2.1이면 투명프록
시를 적용하지 말라는 뜻이다.
2) 설정해제
# iptables -t nat -F

www외의 인터넷 연결에 대한 nat설정
1) 설명: 주의할 것은 투명프록시는 오직 http 즉 www검색만 해당되고 telnet이나 ftp는 적용되지 않으므로 내부랜에서 인터넷의 다른 호스트에 telnet 및 ftp를 사용하려면 추가로 SNAT를 설정해 주어야 한다.
2) 설정
# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to 203.247.50.3
=> 
 -A ROSTROUTING
 -s 192.168.2.0/24 : 192.168.2.0 네트워크로부터의 패킷에만 SNAT를 적용한다.
 -o eth0  : 패킷이 나가는 장치를 말한다. 
 -j SNAT : Source NAT를 말한다. 소스 주소를 변경한다는 뜻이다.
 --to 203.247.40.3 : 소스 주소를 203.247.50.3으로 변경하라는 뜻이다.
3) 확인
# iptables -t nat -L
참고
투명프록시가 적용되려면 인터넷에 나가는 패킷이 투명 프록시가 설정되어 있는 리눅스를 통과해야 한다. 통과하지 않는 패킷에 대해서는 포트의 방향을 변경할 방법이 없다. 따라서 투명프록시를 사용하는 모든 내부 컴퓨터의 디폴트 게이트웨이는 리눅스에 부여된 내부 IP주소이어야 한다.


Trackback 2 Comment 1
  1. transparentproxy 2009.07.08 18:51 address edit & del reply

    http://www.cyberciti.biz/tips/linux-setup-transparent-proxy-squid-howto.html