{"id":928,"date":"2009-11-24T22:43:38","date_gmt":"2009-11-25T03:43:38","guid":{"rendered":"http:\/\/mikeconley.ca\/blog\/?p=928"},"modified":"2023-12-20T16:25:18","modified_gmt":"2023-12-20T21:25:18","slug":"playing-around-with-ftp","status":"publish","type":"post","link":"https:\/\/mikeconley.ca\/blog\/2009\/11\/24\/playing-around-with-ftp\/","title":{"rendered":"Playing Around with FTP"},"content":{"rendered":"<p>I&#8217;m taking a Computer Networks course this semester, and for my final project, my partner and I are trying to create signatures for FTP, HTTP, and Skype packets.<\/p>\n<p>The big idea:\u00a0 we want to create some signatures, and then &#8220;replay&#8221; those signatures against some arbitrary IP and port.\u00a0 If we get a response, we analyze the response to see if it matches what we expect from the signature.\u00a0 If it matches, chances are we&#8217;ve determined what kind of server is behind that IP\/Port.<\/p>\n<p>FTP and HTTP are the trivial ones.\u00a0 Skype is going to be quite a bit harder.<\/p>\n<p>Anyhow, here is what I&#8217;ve found out about FTP&#8230;<\/p>\n<h3>FTP<\/h3>\n<p>FTP runs over a TCP connection, so if you&#8217;ve got Telnet, then you&#8217;ve got a basic FTP client.\u00a0 Traditionally, FTP servers run on port 21 &#8211; but really you could put one on whichever port you feel like.<\/p>\n<p>So, I&#8217;m going to try to futz around with the <a href=\"http:\/\/ftp.mozilla.org\/\">Mozilla public FTP server<\/a>, and show you what I get.<\/p>\n<p>First, I&#8217;ll connect to the FTP server with Telnet, like so:<\/p>\n<p><code><br \/>\nmike@faceplant-linux:~$ telnet ftp.mozilla.org 21<br \/>\n<\/code><\/p>\n<p>Here&#8217;s what comes back:<\/p>\n<p><code><br \/>\nTrying 63.245.208.138...<br \/>\nConnected to dm-ftp01.mozilla.org.<br \/>\nEscape character is '^]'.<br \/>\n220-<br \/>\n220-\u00a0\u00a0 ftp.mozilla.org \/ archive.mozilla.org - files are in \/pub\/mozilla.org<br \/>\n220-<br \/>\n220-\u00a0\u00a0 Notice: This server is the only place to obtain nightly builds and needs to<br \/>\n220-\u00a0\u00a0 remain available to developers and testers. High bandwidth servers that<br \/>\n220-\u00a0\u00a0 contain the public release files are available at ftp:\/\/releases.mozilla.org\/<br \/>\n220-\u00a0\u00a0 If you need to link to a public release, please link to the release server,<br \/>\n220-\u00a0\u00a0 not here. Thanks!<br \/>\n220-<br \/>\n220-\u00a0\u00a0 Attempts to download high traffic release files from this server will get a<br \/>\n220-\u00a0\u00a0 \"550 Permission denied.\" response.<br \/>\n220<\/code><\/p>\n<p>If I type in anything and press RETURN, the server responds with:<br \/>\n<code>530 Please login with USER and PASS.<\/code><br \/>\nSince I don&#8217;t have an account, I&#8217;ll just use the basic anonymous one:<\/p>\n<p><code>USER anonymous<\/code><\/p>\n<p>The server responds back with:<\/p>\n<p><code>331 Please specify the password.<\/code><\/p>\n<p>I don&#8217;t have a password, so I&#8217;ll just try a blank one&#8230;<\/p>\n<p><code>PASS<\/code><\/p>\n<p>and blam, I get a ton of stuff back:<\/p>\n<p><code>230-<br \/>\n230-\u00a0\u00a0 ftp.mozilla.org \/ archive.mozilla.org - files are in \/pub\/mozilla.org<br \/>\n230-<br \/>\n230-\u00a0\u00a0 Notice: This server is the only place to obtain nightly builds and needs to<br \/>\n230-\u00a0\u00a0 remain available to developers and testers. High bandwidth servers that<br \/>\n230-\u00a0\u00a0 contain the public release files are available at ftp:\/\/releases.mozilla.org\/<br \/>\n230-\u00a0\u00a0 If you need to link to a public release, please link to the release server,<br \/>\n230-\u00a0\u00a0 not here. Thanks!<br \/>\n230-<br \/>\n230-\u00a0\u00a0 Attempts to download high traffic release files from this server will get a<br \/>\n230-\u00a0\u00a0 \"550 Permission denied.\" response.<br \/>\n230 Login successful.<\/code><\/p>\n<p>Hey alright, I&#8217;m in!\u00a0 Er&#8230;where exactly am I, though?\u00a0 I type in PWD, and the server responds with &#8220;\/&#8221;.\u00a0 So I&#8217;m in the root.\u00a0 Nice.<\/p>\n<p>So what&#8217;s in the root directory, anyhow?\u00a0 I type in LIST.\u00a0 Here&#8217;s what I get back:<\/p>\n<p><code>425 Use PORT or PASV first.<\/code><\/p>\n<p>And here&#8217;s where it gets interesting.\u00a0 This Telnet session I&#8217;ve got here is like a control window.\u00a0 But if I want any actual data from the server, I&#8217;m going to need to either open up one of my ports (and do some port-forwarding on my router) to receive it (PORT), or connect to another port that the FTP server can pipe data through (with PASV).<\/p>\n<p>I&#8217;d rather not go through all of the trouble of port-forwarding, so I&#8217;m going to choose the latter.\u00a0 I type in PASV.\u00a0 The server responds with:<\/p>\n<p><code>227 Entering Passive Mode (63,245,208,138,225,55)<\/code><\/p>\n<p>So what does that big string of numbers mean?\u00a0 The first 4 are the IP address I&#8217;m to connect to (63.245.208.138).\u00a0 The last two tell me what PORT to connect to.\u00a0 The formula to determine the port number is N1*256 + N2.\u00a0 N1, in this case, is 225.\u00a0 N2 is 55.\u00a0 So 225*256 + 55 is 57655.<\/p>\n<p>So I open another Telnet in a separate window, connect to 63.245.208.138 on port 57655, and get&#8230;.<\/p>\n<p>nothing.<\/p>\n<p>Yep, just a blank.\u00a0 I&#8217;ve made the connection, but I haven&#8217;t asked for any data, so there&#8217;s nothing for the connection to say.<\/p>\n<p>However, if I type LIST again in the command window, I get<\/p>\n<p><code>150 Here comes the directory listing.<br \/>\n226 Directory send OK.<\/code><\/p>\n<p>sent into the control window, and<\/p>\n<p><code>-rw-r--r--\u00a0\u00a0\u00a0 1 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 528 Nov 01\u00a0 2007 README<br \/>\n-rw-r--r--\u00a0\u00a0\u00a0 1 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 560 Sep 28\u00a0 2007 index.html<br \/>\ndrwxr-xr-x\u00a0\u00a0 34 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Nov 24 23:32 pub<br \/>\nConnection closed by foreign host.<\/code><\/p>\n<p>pumped into my data window.\u00a0 Notice that the connection closed in the data window.\u00a0 That means that, for every bit of data I want, I either need to redo the whole PASV thing, or supply a PORT that the server can connect to.\u00a0 Bleh.<\/p>\n<p>Let&#8217;s see what else I can do.\u00a0 I type in &#8220;CWD pub&#8221; to change to the pub directory.\u00a0 Using PASV and LIST, I get the following from another data window:<\/p>\n<p><code>drwxrwxr-x\u00a0\u00a0\u00a0 3 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Jun 05\u00a0 2002 OJI<br \/>\n-rw-rw-r--\u00a0\u00a0\u00a0 1 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1144 Jul 03\u00a0 2001 README<br \/>\ndrwxr-xr-x 5561 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 430080 Nov 24 22:14 addons<br \/>\ndrwxr-xr-x\u00a0\u00a0\u00a0 2 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Jul 05\u00a0 2005 artwork<br \/>\ndrwxr-xr-x\u00a0\u00a0\u00a0 2 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Jun 13\u00a0 2008 bouncer<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 5 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Apr 20\u00a0 2009 calendar<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 6 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Aug 11\u00a0 2008 camino<br \/>\ndrwxr-xr-x\u00a0\u00a0 16 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Oct 16\u00a0 2006 cck<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 3 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Jul 10\u00a0 2004 chimera<br \/>\ndrwxrwxr-x\u00a0\u00a0 12 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Aug 31\u00a0 2001 data<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 8 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Jun 19\u00a0 2007 directory<br \/>\ndrwxr-xr-x\u00a0\u00a0\u00a0 4 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 May 17\u00a0 2005 diskimages<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 4 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Jul 26\u00a0 2008 extensions<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 4 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 May 16\u00a0 2003 firebird<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 5 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Aug 12\u00a0 2008 firefox<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 3 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Aug 07\u00a0 1999 grendel<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 5 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Mar 22\u00a0 2009 js<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 4 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Oct 22\u00a0 2004 l10n-kits<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 2 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Nov 24 20:28 labs<br \/>\n-rw-r--r--\u00a0\u00a0\u00a0 1 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1868178 Sep 17\u00a0 2003 ls-lR<br \/>\n-rw-rw-r--\u00a0\u00a0\u00a0 1 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 169159 Sep 17\u00a0 2003 ls-lR.gz<br \/>\ndrwxr-sr-x\u00a0\u00a0\u00a0 4 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Sep 15\u00a0 2005 minimo<br \/>\ndrwxrwsr-x\u00a0\u00a0 12 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Nov 11 06:09 mobile<br \/>\ndrwxrwxr-x\u00a0\u00a0 15 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Jan 04\u00a0 2008 mozilla<br \/>\nlrwxrwxrwx\u00a0\u00a0\u00a0 1 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1 Sep 15\u00a0 2006 mozilla.org -&gt; .<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 2 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Aug 25\u00a0 1998 msgsdk<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 5 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Jul 09\u00a0 2002 nspr<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 4 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Sep 23\u00a0 2002 phoenix<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 3 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Aug 03\u00a0 2000 profiles<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 6 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Aug 12\u00a0 2008 seamonkey<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 5 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 May 04\u00a0 2006 security<br \/>\ndrwxr-xr-x\u00a0\u00a0\u00a0 5 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Aug 13\u00a0 2008 static-analysis<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 8 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Sep 24 19:03 thunderbird<br \/>\ndrwxrwsr-x\u00a0\u00a0\u00a0 4 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 20480 Nov 19 02:26 webtools<br \/>\ndrwxrwxr-x\u00a0\u00a0\u00a0 6 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Aug 11\u00a0 2008 xulrunner<br \/>\ndrwxr-xr-x\u00a0\u00a0\u00a0 2 ftp\u00a0\u00a0\u00a0\u00a0\u00a0 ftp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096 Sep 12 05:51 zz<br \/>\nConnection closed by foreign host.<br \/>\n<\/code><\/p>\n<p>Nice.\u00a0 Alright, now let&#8217;s see if I can download one of those files.\u00a0 I&#8217;m going to try to download README.\u00a0 Using PASV, I create a new data window, and then I type:<\/p>\n<p><code>RETR README<\/code><\/p>\n<p>And, after a little wait, my data window gets:<\/p>\n<pre>Welcome to ftp.mozilla.org!<\/pre>\n<pre>This is the main distribution point of software and developer tools\r\nrelated to the Mozilla project.\u00a0 For more information, see our home\r\npage (http:\/\/www.mozilla.org\/) Go here to download Netscape Communicator:\r\nhttp:\/\/home.netscape.com\/download\/<\/pre>\n<pre>A list of ftp.mozilla.org's mirror sites can be found at:<\/pre>\n<pre>http:\/\/www.mozilla.org\/mirrors.html<\/pre>\n<pre>This site contains source code that is subject to the U.S. Export\r\nAdministration Regulations and other U.S. law, and may not be exported\r\nor re-exported to certain countries (currently Afghanistan (Taliban\r\ncontrolled areas), Cuba, Iran, Iraq, Libya, North Korea, Sudan and\r\nSyria) or to persons or entities prohibited from receiving U.S.\r\nexports (including Denied Parties, entities on the Bureau of Export\r\nAdministration Entity List, and Specially Designated Nationals).<\/pre>\n<pre>If you plan to mirror our site read our crypto FAQ. Send mail to\r\nmirrors@mozilla.org to be added to our mirrors list.<\/pre>\n<pre>http:\/\/www.mozilla.org\/crypto-faq.html#2-1<\/pre>\n<pre>We do not guarantee that any source code or executable code\r\navailable from the mozilla.org domain is Year 2000 compliant.\r\nConnection closed by foreign host.<\/pre>\n<p>Awesome!  I think I have enough information to come up with some kind of signature.<\/p>\n<h3>Resources<\/h3>\n<p>What, you think I figured all this stuff out alone?\u00a0 No way &#8211; I had some help:<\/p>\n<ul>\n<li><a href=\"http:\/\/tools.ietf.org\/html\/rfc959\">RFC 959<\/a> The FTP Specification<\/li>\n<li><a href=\"http:\/\/tools.ietf.org\/html\/rfc1579\">RFC 1579<\/a> &#8220;Firewall-Friendly&#8221; FTP<\/li>\n<li><a href=\"http:\/\/www.the-eggman.com\/seminars\/ftp_error_codes.html\">A slightly sketchy website that lists FTP message codes<\/a><\/li>\n<li><a href=\"http:\/\/www.nsftools.com\/tips\/RawFTP.htm\">A list of raw FTP commands<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m taking a Computer Networks course this semester, and for my final project, my partner and I are trying to create signatures for FTP, HTTP, and Skype packets. The big idea:\u00a0 we want to create some signatures, and then &#8220;replay&#8221; those signatures against some arbitrary IP and port.\u00a0 If we get a response, we analyze [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[5,44],"tags":[25,1210,564,565],"class_list":["post-928","post","type-post","status-publish","format-standard","hentry","category-computer-science","category-internet","tag-ftp","tag-internet","tag-networks","tag-tcp"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/prmTy-eY","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/posts\/928","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/comments?post=928"}],"version-history":[{"count":19,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/posts\/928\/revisions"}],"predecessor-version":[{"id":947,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/posts\/928\/revisions\/947"}],"wp:attachment":[{"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/media?parent=928"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/categories?post=928"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/tags?post=928"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}