{"id":38,"date":"2022-10-27T11:28:14","date_gmt":"2022-10-27T16:28:14","guid":{"rendered":"https:\/\/blogs.oregonstate.edu\/beisec\/?p=38"},"modified":"2022-10-27T11:28:14","modified_gmt":"2022-10-27T16:28:14","slug":"ctf-challenge-twisted-robot","status":"publish","type":"post","link":"https:\/\/blogs.oregonstate.edu\/beisec\/2022\/10\/27\/ctf-challenge-twisted-robot\/","title":{"rendered":"CTF Challenge &#8211; Twisted Robot"},"content":{"rendered":"\n<p>In my first post I mentioned that I love doing Capture-the-Flag (CTF) challenges, so here is a writeup of a challenge I completed recently. This challenge is part of the Google CTF &#8211; Beginners Quest, which is a great place to start if you are new to CTFs. In this post I walk through the steps I took to solve the challenge and at the end I include the python file I wrote to find the secret flag.<\/p>\n\n\n\n<p>This challenge prompts you to download a zip file, which when unzipped contains three files: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>robo_numbers_list.txt  &#8212; A text file containing 624 phone numbers<\/li><li>RoboCaller1337.py &#8212; A python file with several functions (shown below)<\/li><li>secret.enc &#8212; An encrypted file<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Let&#8217;s take a look at the python file to see what we can figure out:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"highlight\" style=\"background: #ffffff\"><pre style=\"line-height: 125%\"><span><\/span><span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 1 <\/span><span style=\"color: #008000;font-weight: bold\">import<\/span> <span style=\"color: #0000FF;font-weight: bold\">random<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 2 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 3 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 4 <\/span><span style=\"color: #408080;font-style: italic\"># Gots to get that formatting right when send it to our call center<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 5 <\/span><span style=\"color: #008000;font-weight: bold\">def<\/span> <span style=\"color: #0000FF\">formatNumber<\/span>(n):\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 6 <\/span>    n <span style=\"color: #666666\">=<\/span> <span style=\"color: #008000\">str<\/span>(n)\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 7 <\/span>    <span style=\"color: #008000;font-weight: bold\">return<\/span> f<span style=\"color: #BA2121\">'{n[:3]}-{n[3:6]}-{n[6:]}'<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 8 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 9 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">10 <\/span><span style=\"color: #408080;font-style: italic\"># This generates random phone numbers because it's easy to find a lot of<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">11 <\/span><span style=\"color: #408080;font-style: italic\"># people! Our number generator is not great so we had to hack it a bit to<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">12 <\/span><span style=\"color: #408080;font-style: italic\"># make sure we can reach folks in Philly (area code 215)<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">13 <\/span><span style=\"color: #008000;font-weight: bold\">def<\/span> <span style=\"color: #0000FF\">generateRandomNumbers<\/span>():\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">14 <\/span>    arr <span style=\"color: #666666\">=<\/span> []\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">15 <\/span>    <span style=\"color: #008000;font-weight: bold\">for<\/span> i <span style=\"color: #AA22FF;font-weight: bold\">in<\/span> <span style=\"color: #008000\">range<\/span>(<span style=\"color: #666666\">624<\/span>):\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">16 <\/span>        arr<span style=\"color: #666666\">.<\/span>append(formatNumber(random<span style=\"color: #666666\">.<\/span>getrandbits(<span style=\"color: #666666\">32<\/span>) <span style=\"color: #666666\">+<\/span> (<span style=\"color: #666666\">1<\/span> <span style=\"color: #666666\">&lt;&lt;<\/span> <span style=\"color: #666666\">31<\/span>)))\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">17 <\/span>    <span style=\"color: #008000;font-weight: bold\">return<\/span> arr\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">18 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">19 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">20 <\/span><span style=\"color: #008000;font-weight: bold\">def<\/span> <span style=\"color: #0000FF\">encodeSecret<\/span>(s):\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">21 <\/span>    key <span style=\"color: #666666\">=<\/span> [random<span style=\"color: #666666\">.<\/span>getrandbits(<span style=\"color: #666666\">8<\/span>) <span style=\"color: #008000;font-weight: bold\">for<\/span> i <span style=\"color: #AA22FF;font-weight: bold\">in<\/span> <span style=\"color: #008000\">range<\/span>(<span style=\"color: #008000\">len<\/span>(s))]\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">22 <\/span>    <span style=\"color: #008000;font-weight: bold\">return<\/span> <span style=\"color: #008000\">bytes<\/span>([a <span style=\"color: #666666\">^<\/span> b <span style=\"color: #008000;font-weight: bold\">for<\/span> a, b <span style=\"color: #AA22FF;font-weight: bold\">in<\/span> <span style=\"color: #008000\">zip<\/span>(key, <span style=\"color: #008000\">list<\/span>(s<span style=\"color: #666666\">.<\/span>encode()))])\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">23 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">24 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">25 <\/span><span style=\"color: #008000;font-weight: bold\">def<\/span> <span style=\"color: #0000FF\">menu<\/span>():\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">26 <\/span>    <span style=\"color: #008000;font-weight: bold\">print<\/span>(<span style=\"color: #BA2121\">\"\"\"<\/span><span style=\"color: #BB6622;font-weight: bold\">\\n\\n<\/span><span style=\"color: #BA2121\">Welcome to the RoboCaller!! What would you like to do?<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">27 <\/span><span style=\"color: #BA2121\">1: generate a new list of numbers<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">28 <\/span><span style=\"color: #BA2121\">2: encrypt a super secret (in beta)<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">29 <\/span><span style=\"color: #BA2121\">3: decrypt a super secret (coming soon!!)<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">30 <\/span><span style=\"color: #BA2121\">4: exit\"\"\"<\/span>)\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">31 <\/span>    choice <span style=\"color: #666666\">=<\/span> <span style=\"color: #BA2121\">''<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">32 <\/span>    <span style=\"color: #008000;font-weight: bold\">while<\/span> choice <span style=\"color: #AA22FF;font-weight: bold\">not<\/span> <span style=\"color: #AA22FF;font-weight: bold\">in<\/span> [<span style=\"color: #BA2121\">'1'<\/span>, <span style=\"color: #BA2121\">'2'<\/span>, <span style=\"color: #BA2121\">'3'<\/span>]:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">33 <\/span>        choice <span style=\"color: #666666\">=<\/span> <span style=\"color: #008000\">input<\/span>(<span style=\"color: #BA2121\">'&gt;'<\/span>)\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">34 <\/span>        <span style=\"color: #008000;font-weight: bold\">if<\/span> choice <span style=\"color: #666666\">==<\/span> <span style=\"color: #BA2121\">'1'<\/span>:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">35 <\/span>            <span style=\"color: #008000\">open<\/span>(<span style=\"color: #BA2121\">'robo_numbers_list.txt'<\/span>, <span style=\"color: #BA2121\">'w'<\/span>)<span style=\"color: #666666\">.<\/span>write(\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">36 <\/span>                <span style=\"color: #BA2121\">'<\/span><span style=\"color: #BB6622;font-weight: bold\">\\n<\/span><span style=\"color: #BA2121\">'<\/span><span style=\"color: #666666\">.<\/span>join(generateRandomNumbers()))\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">37 <\/span>            <span style=\"color: #008000;font-weight: bold\">print<\/span>(<span style=\"color: #BA2121\">\"...done! list saved under 'robo_numbers_list.txt'\"<\/span>)\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">38 <\/span>        <span style=\"color: #008000;font-weight: bold\">elif<\/span> choice <span style=\"color: #666666\">==<\/span> <span style=\"color: #BA2121\">'2'<\/span>:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">39 <\/span>            secret <span style=\"color: #666666\">=<\/span> <span style=\"color: #008000\">input<\/span>(\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">40 <\/span>                <span style=\"color: #BA2121\">'give me your secret and I<\/span><span style=\"color: #BB6622;font-weight: bold\">\\'<\/span><span style=\"color: #BA2121\">ll save it as \"secret.enc\"'<\/span>)\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">41 <\/span>            <span style=\"color: #008000\">open<\/span>(<span style=\"color: #BA2121\">'secret.enc'<\/span>, <span style=\"color: #BA2121\">'wb'<\/span>)<span style=\"color: #666666\">.<\/span>write(encodeSecret(secret))\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">42 <\/span>        <span style=\"color: #008000;font-weight: bold\">elif<\/span> choice <span style=\"color: #666666\">==<\/span> <span style=\"color: #BA2121\">'3'<\/span>:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">43 <\/span>            <span style=\"color: #008000;font-weight: bold\">print<\/span>(<span style=\"color: #BA2121\">\"stay tuned for this awesome feature<\/span><span style=\"color: #BB6622;font-weight: bold\">\\n\\n<\/span><span style=\"color: #BA2121\">\"<\/span>)\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">44 <\/span>        <span style=\"color: #008000;font-weight: bold\">elif<\/span> choice <span style=\"color: #666666\">==<\/span> <span style=\"color: #BA2121\">'4'<\/span>:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">45 <\/span>            <span style=\"color: #008000;font-weight: bold\">print<\/span>(<span style=\"color: #BA2121\">\"Thank you for using RoboCaller1337!\"<\/span>)\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">46 <\/span>    <span style=\"color: #008000;font-weight: bold\">return<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">47 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">48 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">49 <\/span><span style=\"color: #008000;font-weight: bold\">def<\/span> <span style=\"color: #0000FF\">main<\/span>():\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">50 <\/span>    <span style=\"color: #008000;font-weight: bold\">while<\/span> <span style=\"color: #008000\">True<\/span>:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">51 <\/span>        menu()\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">52 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">53 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">54 <\/span><span style=\"color: #008000;font-weight: bold\">if<\/span> <span style=\"color: #19177C\">__name__<\/span> <span style=\"color: #666666\">==<\/span> <span style=\"color: #BA2121\">\"__main__\"<\/span>:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">55 <\/span>    main()\n<\/pre><\/div>\n<\/div>\n<\/div>\n\n\n\n<p>The two functions that we should focus on are &#8220;generateRandomNumbers()&#8221; and &#8220;encodeSecret()&#8221;. The first was used to generate the list of phone numbers in the provided text file and the second was used to create the encrypted file. Presumably, this encrypted file contains the flag so our goal is to figure out how to undo the encryption process.<\/p>\n\n\n\n<p>The flag was encrypted through the following process:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Breaking it into individual letters<\/li><li>Encoding each letter with UTF-8 encoding, and <\/li><li>XOR-ing each letter with a randomly generated value<\/li><\/ol>\n\n\n\n<p>In order to retrieve the flag we must reverse this process, however this means we need to figure out the values that were randomly generated for the XOR-ing step. So I turned to Google to see if there exists a way to discover the seed used for &#8220;random()&#8221;.<\/p>\n\n\n\n<p>My searching informed me that &#8220;random()&#8221; uses the Mersenne Twister as its pseudo-random number generator (PRNG). And more importantly, it has a vulnerability.<\/p>\n\n\n\n<p>If you are able to acquire 624 consecutive values from &#8220;random()&#8221;, then you can correctly predict every additional value that it will generate. Fortunately in the provided python program, &#8220;random()&#8221; is called 624 times to generate the list of phone numbers, which we are given in &#8220;robo_numbers_list.txt&#8221;.<\/p>\n\n\n\n<p>After some searching I found a module that can be installed and used to predict the future values generated by &#8220;random()&#8221;. I installed and imported the module, fed in the random numbers from &#8220;robo_numbers_list.txt&#8221;, XOR-ed these values with each value in &#8220;secret.enc&#8221;, and undid the UTF-8 encoding of each letter. After combining the letters into a single string and printing it, I was able to see the encrypted message:<\/p>\n\n\n\n<p>CTF{n3v3r_3ver_ev3r_use_r4nd0m}<\/p>\n\n\n\n<p>Here&#8217;s the python program I wrote to uncover this flag:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"highlight\" style=\"background: #ffffff\"><pre style=\"line-height: 125%\"><span><\/span><span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 1 <\/span><span style=\"color: #008000;font-weight: bold\">from<\/span> <span style=\"color: #0000FF;font-weight: bold\">mt19937predictor<\/span> <span style=\"color: #008000;font-weight: bold\">import<\/span> MT19937Predictor\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 2 <\/span><span style=\"color: #408080;font-style: italic\"># https:\/\/github.com\/kmyk\/mersenne-twister-predictor<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 3 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 4 <\/span>predictor <span style=\"color: #666666\">=<\/span> MT19937Predictor()\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 5 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 6 <\/span><span style=\"color: #408080;font-style: italic\"># Open the phone number list to retrieve the randomly generated numbers<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 7 <\/span>roboNums <span style=\"color: #666666\">=<\/span> []\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 8 <\/span><span style=\"color: #008000;font-weight: bold\">with<\/span> <span style=\"color: #008000\">open<\/span>(<span style=\"color: #BA2121\">\"robo_numbers_list.txt\"<\/span>) <span style=\"color: #008000;font-weight: bold\">as<\/span> infile:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\"> 9 <\/span>    <span style=\"color: #008000;font-weight: bold\">for<\/span> <span style=\"color: #008000\">file<\/span> <span style=\"color: #AA22FF;font-weight: bold\">in<\/span> infile:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">10 <\/span>        roboNums<span style=\"color: #666666\">.<\/span>append(<span style=\"color: #008000\">int<\/span>(<span style=\"color: #008000\">file<\/span><span style=\"color: #666666\">.<\/span>replace(<span style=\"color: #BA2121\">\"-\"<\/span>,<span style=\"color: #BA2121\">\"\"<\/span>)<span style=\"color: #666666\">.<\/span>strip(<span style=\"color: #BA2121\">\"<\/span><span style=\"color: #BB6622;font-weight: bold\">\\n<\/span><span style=\"color: #BA2121\">\"<\/span>)) <span style=\"color: #666666\">-<\/span> (<span style=\"color: #666666\">1<\/span> <span style=\"color: #666666\">&lt;&lt;<\/span> <span style=\"color: #666666\">31<\/span>))\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">11 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">12 <\/span><span style=\"color: #408080;font-style: italic\"># Feed \"random\" phone numbers into the predictor<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">13 <\/span><span style=\"color: #008000;font-weight: bold\">for<\/span> num <span style=\"color: #AA22FF;font-weight: bold\">in<\/span> roboNums:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">14 <\/span>    predictor<span style=\"color: #666666\">.<\/span>setrandbits(num, <span style=\"color: #666666\">32<\/span>)\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">15 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">16 <\/span><span style=\"color: #408080;font-style: italic\"># Retrieve the encoded secret message<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">17 <\/span><span style=\"color: #008000;font-weight: bold\">with<\/span> <span style=\"color: #008000\">open<\/span>(<span style=\"color: #BA2121\">\"secret.enc\"<\/span>, <span style=\"color: #BA2121\">\"rb\"<\/span>) <span style=\"color: #008000;font-weight: bold\">as<\/span> secret:\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">18 <\/span>    letters <span style=\"color: #666666\">=<\/span> <span style=\"color: #008000\">list<\/span>(secret<span style=\"color: #666666\">.<\/span>readline())\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">19 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">20 <\/span><span style=\"color: #408080;font-style: italic\"># Decrypt each letter in the message by XOR-ing it with the \"randomly\"<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">21 <\/span><span style=\"color: #408080;font-style: italic\"># generated value used to encrypt it<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">22 <\/span>answer <span style=\"color: #666666\">=<\/span> <span style=\"color: #BA2121\">\"\"<\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">23 <\/span><span style=\"color: #008000;font-weight: bold\">for<\/span> i <span style=\"color: #AA22FF;font-weight: bold\">in<\/span> <span style=\"color: #008000\">range<\/span>(<span style=\"color: #008000\">len<\/span>(letters)):\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">24 <\/span>    answer <span style=\"color: #666666\">=<\/span> answer <span style=\"color: #666666\">+<\/span> <span style=\"color: #008000\">chr<\/span>(letters[i] <span style=\"color: #666666\">^<\/span> predictor<span style=\"color: #666666\">.<\/span>getrandbits(<span style=\"color: #666666\">8<\/span>))\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">25 <\/span>\n<span style=\"background-color: #f0f0f0;padding: 0 5px 0 5px\">26 <\/span><span style=\"color: #008000;font-weight: bold\">print<\/span>(answer)\n<\/pre><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my first post I mentioned that I love doing Capture-the-Flag (CTF) challenges, so here is a writeup of a challenge I completed recently. This challenge is part of the Google CTF &#8211; Beginners Quest, which is a great place to start if you are new to CTFs. In this post I walk through the [&hellip;]<\/p>\n","protected":false},"author":12768,"featured_media":42,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-38","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/posts\/38","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/users\/12768"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/comments?post=38"}],"version-history":[{"count":4,"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/posts\/38\/revisions"}],"predecessor-version":[{"id":43,"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/posts\/38\/revisions\/43"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/media\/42"}],"wp:attachment":[{"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/media?parent=38"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/categories?post=38"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/beisec\/wp-json\/wp\/v2\/tags?post=38"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}