Introduction to Cybersecurity Bootcamp 2023 CTF Assessment

CTF Walkthrough
مقدمة إلى المعسكر التدريبي للأمن السيبراني من CyberTalents - التقنيات والحلول
Ahmed Fahim
Sept. 4, 2023, 8 p.m.
ahmed_fahim
Introduction to Cybersecurity Bootcamp 2023 CTF Assessment

مقدمة

سنتناول فى هذا المقال حل تحديات مع الحلول لـ CyberTalents, وهى مجموعة من التحديات المختلفة في تخصصات مثل (Web security , cryptography , digital forensics , Network Security.......) وهى عبارة عن حل لتحديات لـ Introduction to Cybersecurity Bootcamp(Online) 2023 , من متطالبات الـ Bootcamp ان تكون علي معرفة بأساسيات Linux , التحديات بالترتيب حسب كل Lesson تقوم بدراسته.  

 

Introduction to CTF » competition

التصنيف: معلومات عامة

الوصف: نوع خاص من مسابقة الأمن السيبراني المصممة لتحدي المشاركين لحل مشاكل أمن الكمبيوتر

الإجابة: Capture the Flag (CTF)

Cybersecurity Overview » fisher

التصنيف: معلومات عامة

الوصف: ما هي الوظيفة المطابقة للتعريف أدناه؟

الأفراد الذين يعرفون تفاصيل الأمن السيبراني ولديهم دراية جيدة في اكتشاف الثغرات ونقاط الضعف. هناك العديد من منصات مكافآت الأخطاء تقوم بإعطائهم هدايا مقابل العثور على نقاط الضعف في التطبيقات والبرامج.

 flag{bug bounty hunter}

 

Attacks & Vulnerabilities » Mailer

التصنيف: Digital Forensics

الوصف: حصلنا على الدليل على البريد الإلكتروني للتصيد الاحتيالي ولكننا نحتاج إلى معرفة اسم ملف البرنامج الضار

Link: https://hubchallenges.s3-eu-west-1.amazonaws.com/Forensics/mail_bak.7z

الأجابة: لتحميل الملف علي الجهاز بإستخدام wget

لنقم بإستخراج محتوايات الملف 

الملف يحتوي علي ملفين Index , Sent سأقوم بإلقاء نظرة عليهم من خلال mousepad editor

نحن نبحث عن اسم ملف ضار اذا نقوم بالبحث عن ملف بإمتداد exe. بعد البحث في ملف Index لم احصل عليه 

أما بالنسبة لملف Sent قمت وجدت فيه الملف 

بإمكاننا تجربة طريقى أخري أفضل وهي من خلال Terminal

قمت بعرض محتويات الملفان في نفس الوقت بإستعمال cat و عمل filter للمحتوي المعروض والبحث عن اي جملة تحتوي علي (exe.) بإستعمال grep

flag{Mal_strike8941934890753353453.exe}

 

Data Encryption » Hide Data

التصنيف: Data Encryption

الوصف: لقد كنت أقوم بإخفاء بياناتي باستخدام classic cypher، هل يمكنك الحصول علي flag المخفي ؟


gur synt vf 2w68lsudym Vg vf cerggl rnfl gb frr gur synt ohg pna lbh frr vg v gbbx arneyl 1 zvahgr gb rapbqr guvf jvgu EBG13 tbbq yhpx va fbyivat gung

 

الإجابة: يبدو هذا مثل تشفير ROT13 الكلاسيكي. فلنفك التشفير ونحصل على ما يلي:

https://rot13.com/

2j68yfhqlz

 

 

Scapy » ARP Storm

 

التصنيف: Network Security

الوصف: An attacker in the network is trying to poison the arp table of 11.0.0.100, the admin captured this PCAP.

 Link:https://hubchallenges.s3-eu-west-1.amazonaws.com/Forensics/ARP+Storm.pcap

 

لنقم بتحميل الملف وفتحة بإستخدام اداة Wireshark 

سوف في قسم info أنها تحتوي علي بعض hex characters

 

لنحاول استخدام tshark  حتي نستطيع استخراج الأحرف كما نريد

سنقوم بإستعمال هذا الأمر لاستخراج قيمتها..........

"tshark -r ARP+Storm.pcap" : هذا الجزء من الأمر يقرأ ملف  "ARP+Storm.pcap".
"Tfields -e arp.opcode-": هذا الجزء يحدد أنك تريد استخراج field ال "arp.opcode" من كل حزمة وعرضه كناتج.
"|": هذه هي رمز piping الذي يتيح استخدام ناتج الأمر السابق كمدخل للأمر التالي.
"awk '{printf("%c",$1)}'": هذا الأمر "awk" يأخذ قيمة الـ "opcode" ويقوم بتحويلها إلى..

ال"printf("%c", $1)": هذا هو الإجراء الذي تقوم بتوجيه "awk" حتي ينفذ على كل سطر من المدخلات.
- ال"printf": هذه هي وظيفة في "awk" تُستخدم لتنسيق وطباعة الناتج.
- ال"%c": هذا هو محدد التنسيق الذي يشير إلى أنك تريد طباعة حرف.
- "$1": يُشير إلى الحقل الأول (العمود الأول) في السطر الحالي. في حالتك، إنه قيمة معرف العملية ARP التي استخرجتها باستخدام الأمر السابق "tshark".

نقم بعمل decode ل القيمة التي خرجت لي 

flag{gr@tuit0us_0pcOde_1s_Alw@ys_A6uSed_t0_p01s0n}

 

Introduction to Kali Linux » remove

التصنيف: معلومات عامة

الوصف: أحتاج إلى إزالة ملف يسمى 'secret' في home directory الخاص بي. الأمر الذي يجب أن أستخدمه

 rm ~/secret

 

Introduction to Kali Linux » Distribution

 

التصنيف: معلومات عامة

الوصف: توزيعة مبنية على دبيان Debian مع مجموعة من أدوات security و forensics . وتتميز بتحديثات أمنية  ودعم ARM architecture
flag بدون مسافات

kalilinux

 

 

Introduction to Kali Linux » Linuxcmd 101

 

التصنيف: Bash

الوصف: سيساعدك هذا التحدي على فهم الأوامر الأساسية في نظام التشغيل Linux ,, كل نقطة مرتبطة بنقطة أخرى، قم بتوصيل الرابط واحصل علي flag!

سنقوم بفتح الملف

 

سنري ان الملف مضغوط
سنحاول فك ضغط الملف هناك طريقتان لفك ضغط الملف أما من خلال gzip و tar كما في الصورة الاولي أول من خلال tar فقط كما في الصورة الثانية

لنقم بالدخول الي المسار linux-chal/cat/ سنري انه يحتوي علي ملف مضغوط وملف مخفي عند قراءة الملف سنري كلمة السر الخاصة ب exec.zip سنقوم بفك ضغط الملف من خلا 7z  ونضع كلمة السر qwerty1245

عند الدخول الي directory exec  سنري أن هناك ملف asiic.zip وأيضا ملف (-) عند محاولة قراءة الملف لن تجدي اي شئ عند النظر الي صلاحيات الملف سيتضح أنه ملف executable سنقوم بتشغيله سيقوم بإرجاع كلمة سر قم بفك ضغط الملف واستخدام كلمة السر

نقوم بالدخول الي directory ascii نري أنه يحتوي علي ملفات سنحاول معرفة نوع هذه الملفات من خلال الأمر file نري أن الملف f6 عبارة عن ASCII text

عند قراءة محتوي الملف نري كلمة السر قم بفك ضغط الملف الأن.............

نقم بالدخول إلي size37 نري أنه يحتوي علي العديد من الملفات أيضا وهذه الملفات عبارة عن ASCII text عند تجربة القيم الموجودة في هذه الملفات ككلمة سر للملف المضغوط لم تنجح 

لذلك قمت بحفظ جميع كلمات السر في الملف واستخدم أداة john لمحاولة عمل crack لها 
هذه هي كلمة السر 62094n902m2x-28mx4t9xy282y49ty9824yt

 

نقم بالدخول الي directory يحتوي علي ملف nexttocybertalents عبارة عن wordlist سنحاول استخراج كلمة cybertalents نري أن كلمة السر orderby1337

نقم بالدخول الي directory التالي نري ملف بإسم One عبارة عن wordlist سنحاول عمل crack لكلمة بإستخدام john مره أخري سنري كلمة السر كما في الصور...........

بالدخول الي المجلد التالي نري ملف بإسم pass عند قراة محتواة عبارة عن تشفير base64 عند عمل decode له نري كلمة السر ونقم بفك ضغط الملف

بالدخول الي المجلد التالي نري ملف بإسم flag عند قراءة محتواة لن نفهم شئ علي الاغلب هو عبارة عن ROT13 decode 

نأخذ هذه القيمة ونحاول عمل decode لها من خلال موقع https://rot13.com/  الأن نري Flag

flag{s1mple_linux_101}

 

Hash Cracking » Guess The Password

 

التصنيف: Cryptography

الوصف: قام أحد hacker بتسريب hash عبر الإنترنت. هل يمكنك عمل crack لمعرفة كلمة المرور الخاصة بالرئيس التنفيذي؟ flag هو password Hash
06f8aa28b9237866e3e289f18ade19e1736d809d

الحل:

نحتاج إلي تحديد نوع hash نقوم بإستعمال هذا الموقع https://www.onlinehashcrack.com/hash-identification.php اتضح أنه SHA-1 

الأن كل ما نريد ان نفعله هو محالة عمل crack له سنستخدم هذا الموقع https://sha1.gromweb.com

 

jrahyn+

 

Introduction to Digital Forensics » Crime scene

التصنيف: معلومات عامة

الوصف: Process of analyzing and investing computer devices, on suspecting that such devices may have been used in a cybercrime
Flag Format: XXXXXXXXX

forensics

 

Steganography » Greeks

التصنيف: معلومات عامة

الوصف: فن إخفاء الرسائل أو المعلومات داخل صورة/نص أو بيانات أخرى

Steganography

 

Steganography » JTAG Dump

التصنيف: Digital Forensics

الوصف: This is a JTAG mobile Extraction for a handset in a criminal case

الحل:

 

تحميل الملف علي جهازنا نقم بفتح الملف من خلال أداة binwalk ونحاول استخراج الملفات

الأمر  يقوم بتحليل ملف "Jtag-dump.bin" باستخدام أداة "binwalk" هي أداة مفتوحة المصدر تُستخدم لتحليل وفحص الملفات بحثًا عن بيانات مخفية أو مضمنة.
ويقوم بإجراء استخراج لجميع البيانات الموجودة في الملف باستخدام تعبير العبور ".*". هذا سيقوم بعرض جميع البيانات المستخرجة.

ستقوم بإستخراج البيانات في directory جديد عند فتحة والبحث في الصور سنري flag

Flag{Remember_header_then_footer}

 

 

Steganography » Images3c

التصنيف: Digital Forensics

الوصف: يتطلب تأمين صورة مهمة تشفيرًا جيدًا. لذلك أضفنا طبقة أمان إضافية لصورتك وهي الآن غير قابلة للكسر!

الحل: 

نقوم بتحميل الملف وفك ضغطه نري انه كان عبارة عن صورة ليس هناك أي شئ مهم............!!!!!!!!!

 

سنقوم بإستخدام أداة stegseek لمحاولة استخراج ال Flag من خلال عمل bruteforce للملف 


https://github.com/RickdeJager/stegseek

stegseek هي أداة برمجية مفتوحة المصدر تُستخدم للبحث عن بيانات مخفية داخل ملفات الصور باستخدام تقنيات التحقق من signature. تستند Stegseek إلى مكتبة تسمى "steghide" للكشف عن البيانات المخفية باستخدام أنماط معينة والتحقق من signature security للملف.

الأمر يقوم بفحص الصورة "cyber.jpg" باستخدام قائمة الكلمات المرور "rockyou.txt" للبحث عن أي بيانات مخفية، ثم يقوم بإخراج هذه البيانات المخفية إلى ملف "flag.txt".

flag{cyb3rs3cisaw3s0me}

 

 

Steganography » I love music

التصنيف: Digital Forensics

الوصف: listen and focus , you will listen another thing
Flag format : XXX_XXX_XXXXXXXXXXX

 

الحل: 

تحميل الملف https://s3-eu-west-1.amazonaws.com/hubchallenges/Forensics/love-music.wav

نقوم بفتح الملف من خلال برنامج Sonic-visualizer وسنري أن الملف أمامنا بهذا الشكل.......

https://www.sonicvisualiser.org/download.html

نقوم بالضغط علي Layer ثم Add spectrogram ثم  All Channels mixed 

الأن نري Flag 

you_are_victorious!

 

Introduction to Web Security » Reward

التصنيف: معلومات عامة

الوصف: I receive a reward or mentioned on a wall of fame when i found vulnerability . I am participating in ..... program? Format of Flag ( Do not use spaces)

bugbounty

 

 

 

 

HTML » htmlentities

التصنيف: معلومات عامة

الوصف: True or False , htmlentities ( convert special characters to its html entity ) can't be exploited to run XSS payload ؟

false

 

OWASP Top 10 » Contribute

التصنيف: معلومات عامة

الوصف: I am an Organization that releases the Top 10 Vulnerabilities in Application Security. I am ……؟

OWASP

 

Cookies » Admin has the power

 

التصنيف: Web Security

الوصف:  Administrators only has the power to see the flag , can you be one ?

الحل:

نقم بتشغيل التحدي وفتح الرابط

نلقي نظرة علي source code نري أنه يحتوي علي معلومات تسجيل دخول لمستخدم support

نقم بتسجيل الدخول نري أننا لن نسطيع رؤية flag إلا بمستخدم admin كما كتب في الوصف

ليس هناك شئ مهم في source code الخاص بالصفحة قمت بعمل inspect حتي اري cookie ورأيت ان role قميتها هي support أي اسم المستخدم

حسنا هذا جيد قمت بتغير هذه القيمة إلي admin

وعمل reload إلب الصفحة نري أننا استطعنا الدخول كمستخدم admin و حصلنا علي flag

hiadminyouhavethepower

 

 

JavaScript » This is Sparta

 

التصنيف: Web Security

الوصف: Morning has broken today they're fighting in the shade when arrows blocked the sun they fell tonight they dine in hell

FLAG Format:  {flagbody}

 

الحل: 

نقم بتشغيل التحدي وفتحة

 

عند النظر غي source code نري بعض الأكواد غير المفهومة ولكن هي تبدأ ب <script> وتنتهي ب </script> اذا هذه عبارة عن javascript code ولكن obfuscate 

 

 نقوم بعمل نسخ له والانتقال لهذا الموقع https://deobfuscate.io ونري JS code نري أن بيانات تسجيل الدخول اسم المستخدم وكلمة السر هي Cyber-Talent  

function check() {
  var _0xeb80x2 = document.getElementById("user").value;
  var _0xeb80x3 = document.getElementById("pass").value;
  if (_0xeb80x2 == "Cyber-Talent" && _0xeb80x3 == "Cyber-Talent") {
    alert("                      Congratz \n\n");
  } else {
    alert("wrong Password");
  }
}

نقم بتسجيل الدخول والأن نري flag 

   {J4V4_Scr1Pt_1S_Aw3s0me}

 

PHP Basics » Cheers

التصنيف: Web Security

الوصف: Go search for what cheers you up

الحل:

قم بتشغيل التحدي وفتح الرابط الخاص به سنرب أن الصفحة تعرض لنا error 

وهذا يعني أنه يتعين علينا إضافة welcome parameter الي request في URL 

عند إضافة سنري error أخر 

 

سنقوم بإضافة gimme_flag parameter ونري response

 

الان وصلنا إلي flag

FLAG{k33p_c4lm_st4rt_c0d!ng}

 

 

PHP Basics » ghaZe

التصنيف: Web Security

الوصف: May Be Guessing Is Helpful ;) 

الحل:

نقوم بتشغيل التحدي الوصول إليه

قمت بالنظر إلي source code رأيت أن بيانات تسجيل الدخول admin:admin

قمت بتسجيل الدخول وهذا ما ظهر

قمت بمحاولة البحث عن hidden directories بإستخدام diresearch

وكل ما توصلت إليه هو empty directory يسمي flag.php ما فهمته بعد ذلك انه عند محالة تسجيل الدخول يقوم بإعادة توجيهي إلي InSiDe.php 

 

الأن لنقم بمحاولة البحث عن parameter بإستخدام أداة arjun 

وقام بإرجاع هذه الصفحة 

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=<device-width>, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Welcome Admin</h1>
</body>
</html>
<?php
require_once("flag.php");
if(isset($_GET['src']))
{
    highlight_file("InSiDe.php")and die();
}else{"<h2>Contiue Searching</h2>";}

if(strcmp($_GET['flag'],"View")==0)
{
    echo "<br/><h1>You Pass The Stage 1 The Flag Is  </h1><br/>";
    echo "<h1>$flag1";
}
if (isset($_COOKIE['kk']) &&  isset($_COOKIE['cc']))
{
    if($_COOKIE['kk'] != $_COOKIE['cc'])
    {
        if(md5($_COOKIE['kk'])==md5($_COOKIE['cc']))
        {
           echo "<br/><h1>You Pass The Stage 2 The Flag Is </h1> <br/>";
           echo "<h2>$flag2</h2>";
         }
    }
 }

 $useragent = $_SERVER['HTTP_USER_AGENT'];
 if (is_numeric($useragent))
 {
     if(strlen($useragent) < 4)
     {
        if ($useragent > 10000)
        {
            echo "<br/><h1>You Pass The Stage 3 The Flag Is  </h1><br/>";
            echo $flag3;
        }
     }
 }
?>

 

هذا الجزء من code يقوم بفحص query parameter $_GET['flag'] للتحقق مما إذا كانت قيمته تساوي "View". إذا كانت القيمة تساوي "View"، فإنه يقوم بعرض رسالة مع flag المرتبط بالمرحلة الأولى من التحدي.

if(strcmp($_GET['flag'],"View")==0)
{
    echo "<br/><h1>You Pass The Stage 1 The Flag Is  </h1><br/>";
    echo "<h1>$flag1";
}

 

 

أما بالنسبة للجزء الثاني 

 نحتاج إلى قيمتين من cookie ل[ cc & kk] هذه القيمتين مختلفة , اما بالنسبة لقيمة md5 هي نفسها..............…

هذه تسمي Type Juggling أتمني أن تنظر إلي هذا الملف https://owasp.org/www-pdf-archive/PHPMagicTricks-TypeJuggling.pdf

if (isset($_COOKIE['kk']) && isset($_COOKIE['cc']))
{
if($_COOKIE['kk'] != $_COOKIE['cc'])
{
if(md5($_COOKIE['kk'])==md5($_COOKIE['cc']))
{
echo "<br/><h1>You Pass The Stage 2 The Flag Is </h1> <br/>";
echo "<h2>$flag2</h2>";
}}}

 

حسنا كيف سنحصل علي هذه القيم قم بالانتقال إلي هذا https://github.com/spaze/hashes/blob/master/md5.md وأختر أي قيمتين علي سبيل المثال أول قيمتين

 

240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580

وبإستخدام burpsuit قمت بتعديل قيمة cookie كما تري في الصورة وعثرنا علي الجزء الثاني من flag

 

الجزء الثالث من الكود

يقوم بالتحقق ما اذا كان useragent رقم اذا تحقق الشرط يقوم بالتحقق ما اذا كان طولة أقل من 4 واذا كان صحيح يتحقق اذا كان قيمته أكبر من 10000 

$useragent = $_SERVER['HTTP_USER_AGENT'];
 if (is_numeric($useragent))
 {
     if(strlen($useragent) < 4)
     {
        if ($useragent > 10000)
        {
            echo "<br/><h1>You Pass The Stage 3 The Flag Is  </h1><br/>";
            echo $flag3;
}}}

وبإستخدام burpsuit قمت بتعديل قيمة user-agent في request وقمت بتغيرها ب 9e9 وهو تعبير علمي للرقم 9 مرفوع لأس 9، ويمكن تفسيرها بأنها تعني 9 مضروبة في نفسه تسع مرات.
قيمة "9e9" كرقم هو 9,000,000,000، أو بمعنى آخر 9 مليار.

 

flag: Flag{Arju!n_Md5_ll_Exp0oNential_Ar3_GOod_!}

 

 

Burp Suite » The Restricted Sessions

 

التصنيف: Web Security

الوصف: Flag is restricted to logged users only, can you be one of them

الحل:

نشغل التحدي ونبدأ نبص عليه هتلاقية بيقولك إنك محتاج تكون login in علشان تشوف flag 

 

لو بصينا علي source code  هلاقي كود js بيعمل اي الكود ده

الكود يسترد معلومات المستخدم الحالية من ملف PHP يسمى getcurrentuserinfo.php. يتحقق مما إذا كان المتغير "document.cookie" ليس فارغًا. إذا لم يكن فارغًا، فسيقوم بإرسال POST Request إلى الملف getcurrentuserinfo.php. يحتوي POST Request على قيمة ملف تعريف الارتباط  `PHPSESSID`، والتي تُستخدم لتحديد session المستخدم الحالية. يقوم الملف getcurrentuserinfo.php بعد ذلك بإرجاع معلومات المستخدم الحالية إلى JavaScript.و يتم تخزين معلومات المستخدم الحالية في المتغير "cu".

<script type="text/javascript">

      if(document.cookie !== ''){
        $.post('getcurrentuserinfo.php',{
          'PHPSESSID':document.cookie.match(/PHPSESSID=([^;]+)/)[1]
        },function(data){
          cu = data;
        });
      }
</script>

سوف أقوم بإعتراض request بإستخدام burpsuit وهنلاقي إن مفيش قيمة cookie بتتبعت في request هبعت request ل repeater أبدا اعدل اللي أنا محتاجة 

سأقوم بإضافة قيمة cookie ل request سنري أن response يقوم بإرجاع أن Session not found in data/session_store.txt

 

 

عند فتح هذا الملف في المتصفح نجد انه يحتوي علي معلومات session لثلاث مستخدمين 

لنقم بتجربة استخدام session منهم هلاقية بيقولي إن UserInfo Cookie don't have the username , Validation failed 

سوف أقوم بإضافة UserInfo الي cookie سيقوم بالرد Validation failed إذا user ليست هذه session الخاصة به

في JS code يسترد معلومات المستخدم الحالية من ملف PHP يسمى getcurrentuserinfo.php. ولكن يجب أن يكون POST Request لنجرب أن نري هذه المعلومات

حسنا هذا جيد جدا استطعنا الوصول إلي معلومات session لنجرب أن نقوم بعمل login in من خلال session و UserInfo الذي هي name  الخاص يالمستخدم

تم تسجيل الدخول وحصلنا علي Flag 

Flag: sessionareawesomebutifitsecure

 

 

Vulnerability Assessment » CVE Number

 

التصنيف: معلومات عامة

الوصف: 

What is the CVE ID that is related to EternalBlue

Flag Format: XXX-XXXX-XXXX

الحل : CVE-2017-0144

 

Vulnerability Assessment » remote-CVE

 

التصنيف: Machines

الوصف: What’s CVE ID could be used against the web application in the below target

الحل :

قم بتشغيل التحدي سيظهر لك ip الخاص ب Machine 

نحن نبحث عن cve id الخاص بإحدي service التي تعمل علي web app حسنا سوف اقوم بعمل scan nmap 

هتلاقي الإصدار هتبحث عن الإصدار هتلاقي CVE ID ده

CVE-2014-6287

 

 

WIFI Attacks » WPA Crack 

التصنيف: Machines

الوصف: You are conducting a WIFI pentest, Handshake has been captured and your task is to crack it

Flag format is just the password 

Link:https://hubchallenges.s3-eu-west-1.amazonaws.com/Machines/wpa943050264305852656243865.cap

التحدي عبارة عن ملف cap يجب عمل crack لكلمة السر الخاصة به وكلمة السر هي flag

سوف نقوم بتحميل الملف 

 

هنستخدم أداة aircrack-ng علشان أقدر أعمل crack و هنستعمل wordlist 

 

هنلاحظ أنه تم العثور علي كلمة السر 

biscotte

 

 

Traffic Analysis » Capture

التصنيف: معلومات عامة

الوصف: Network analysis tool used to captured packets and present it in readable format

Wireshark

الخاتمة

الى هنا نكون ان انهينا حل التحديات والى اللقاء فى تحديات وتقنيات اكثر laugh , لا تتردد فى مشاركة المقال على ؤسائل التواصل الاجتماعى لتعم الفائدة على الجميع , واخبرنا فى التعليقات عن ما هى التحديات التى تريدنا حلها فى المرة القادمة .


Ctf Writeup Ctf Cybersecurity Hacking Pentesting cybertalents ctf walkhrough cybersecurity bootcamp